Lire un fichier en tant que sudo depuis Ruby on Rails

Aug 19 2020

Étonnamment, je n'ai trouvé personne essayant de faire cela, c'est pourquoi je pose cette question.

La chose est que j'ai un fichier, où je stocke des données. Je veux avoir une option dans mon projet de rails, où vous pouvez "exporter" certains objets qui sont définis dans ce fichier.

Ce fichier appartient à la racine, donc si j'essaie de le lire avec File.read ("myfile.json"), il échoue avec cette erreur:

#<Errno::EACCES: Permission denied @ rb_sysopen - /opt/rb/etc/cep/state.json>

Existe-t-il un moyen de le lire en tant que root? Peut-être que la solution est d'exécuter un "sudo cat myfile.json" comme une commande de ruby ​​et d'injecter le résultat dans une variable?

Mon objectif est de placer le contenu de ce fichier dans un autre que l'utilisateur téléchargera, afin que plus tard, il puisse télécharger ce fichier et avoir tous les objets d'avant. C'était bizarre de ne pas voir plus de gens essayer de faire ça alors je ne sais pas si je demande peut-être quelque chose de stupide. Je n'ai trouvé aucune information à ce sujet dans Google, il n'est peut-être pas possible d'ouvrir un fichier en tant que sudo avec File.open.

Réponses

1 ViníciusAlonso Aug 19 2020 at 20:23

Un moyen simple de le résoudre rapidement est de changer le propriétaire du fichier.

sudo chown $USER myfile.json

1 Ebordon Aug 19 2020 at 20:27

Si vous souhaitez accéder à un fichier, je pense que ce n'est pas une bonne idée de donner à votre application un accès sudo. C'est potentiellement dangereux.

Vous pouvez modifier l'autorisation sur le fichier à la place, en modifiant le propriétaire / groupe du fichier.

Ici vous pouvez trouver comment obtenir l'utilisateur exécutant l'application.

Cette commande changera le propriétaire du fichier

sudo chown <my_user> /opt/rb/etc/cep/state.json

Une autre option consiste à créer un groupe avec le propriétaire actuel et l'utilisateur des rails et à définir ce groupe comme propriétaire:

sudo groupadd mynewgroup
sudo usermod -a -G mynewgroup <my_user>
sudo usermod -a -G mynewgroup <current_user>
sudo chgrp mynewgroup /opt/rb/etc/cep/state.json