Changer d'utilisateur et charger tout l'environnement dans un script shell

9

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 someuserm'assurais simplement d'utiliser le -ldrapeau 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 suou 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 -cet 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 sortie
  • su -l webuser -c which bundle # => pas de sortie
  • sudo su - webuser -c which bundle # => pas de sortie

Mais en tant qu'utilisateur Web

  • which bundle # => / opt / ruby ​​/ bin / bundle
Daniel Upton
la source
1
As-tu essayé su - user -c?
Karlson
De quelle distribution s'agit-il?
artistoex
Votre script dépend-il des modules ruby ​​installés par utilisateur?
Keith
@artistoex c'est ubuntu :)
Daniel Upton
1
Je m'assurerais que c'est vraiment un problème de PATH (vider la variable dans le script). Comparez ensuite les CHEMINS et regardez /etc/profile ~/.bash_profile ~/.bash_loginet ~/.profile. Pour les shells de connexion, bash les évalue dans l'ordre donné.
artistoex

Réponses:

10

En utilisant, vous sudo su - user -caurez l'impression que vous vous êtes connecté en tant que personne héritant de son chemin. C'est pourquoi su userest différent de su - user.

Cependant, si vous définissez le chemin dans un .bashrcfichier, 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_profileou /etc/profile, voir ceci .

Nate
la source
3
Vous devriez le noter su -et vous su -lêtes également.
jordanm
3
et devrait probablement recommander --loginpour la lisibilité.
3

Pour le contexte de connexion, utilisez soit:

  • sudo -i -u USER COMMAND
  • su -l USER -c COMMAND
H.-Dirk Schmitt
la source