Lire un fichier en tant que sudo depuis Ruby on Rails
É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
Un moyen simple de le résoudre rapidement est de changer le propriétaire du fichier.
sudo chown $USER myfile.json
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