J'ai des problèmes avec un de nos nouveaux scripts qui change d'utilisateur et démarre quelques processus de démon ruby.
Dans le passé, je bash -c "do the business" -l someuser
m'assurais simplement d'utiliser le -l
drapeau pour émuler une connexion.
Cela a très bien fonctionné jusqu'à présent, notre processus Ruby a généré l'erreur suivante: require: no such file to load -- rubygems (LoadError)
après une enquête, j'ai trouvé que cette erreur ne se produit que lorsque j'exécute le script en tant qu'utilisateur root, c'est-à-dire (lorsque je sudo su
ou lorsqu'il est exécuté par upstart).
Je pense que c'est un problème de CHEMIN, car lorsque j'ai défini manuellement le chemin, il résout le problème.
Existe-t-il un moyen de changer d'utilisateur et de charger tout l' environnement?
J'ai aussi essayé su user -c
et sudo
.
Pour le rendre plus facile à tester, je suis "enraciné" ( sudo su
) et en cours d'exécution which bundle
(le bundle est une chose rubis).
Voici ce que j'obtiens:
sudo -i -u webuser which bundle
# => pas de sortiesu -l webuser -c which bundle
# => pas de sortiesudo su - webuser -c which bundle
# => pas de sortie
Mais en tant qu'utilisateur Web
which bundle
# => / opt / ruby / bin / bundle
la source
su - user -c
?/etc/profile
~/.bash_profile
~/.bash_login
et~/.profile
. Pour les shells de connexion, bash les évalue dans l'ordre donné.Réponses:
En utilisant, vous
sudo su - user -c
aurez l'impression que vous vous êtes connecté en tant que personne héritant de son chemin. C'est pourquoisu user
est différent desu - user
.Cependant, si vous définissez le chemin dans un
.bashrc
fichier, il ne prendra effet que pour les sessions interactives (c'est-à-dire ssh-ing en tant que cet utilisateur).Vous devriez plutôt utiliser
.bash_profile
ou/etc/profile
, voir ceci .la source
su -
et voussu -l
êtes également.--login
pour la lisibilité.Pour le contexte de connexion, utilisez soit:
sudo -i -u USER COMMAND
su -l USER -c COMMAND
la source