Comment puis-je exécuter en tant qu'un autre utilisateur?

20

Il s'agit du code bash qui doit être exécuté. Donc, il remplace d'abord l'utilisateur par openproject et exécute ensuite tout le code:

su openproject -c "bash -l" 
cd ~/openproject
git checkout Gemfile.lock
git pull

bundle install
RAILS_ENV="production" bundle exec rake db:migrate
RAILS_ENV="production" bundle exec rake db:seed
RAILS_ENV="production" bundle exec rake assets:precompile

J'ai essayé de chnaging le script ci-dessus dans ceci:

su - openproject -c "cd ~openproject/openproject"

su - openproject -c "git checkout stable"

su - openproject -c "git checkout Gemfile.lock"
su - openproject -c "git pull"

su - openproject -c "bundle install"

su - openproject -c "RAILS_ENV="production" bundle exec rake db:migrate"
su - openproject -c "RAILS_ENV="production" bundle exec rake db:seed"
su - openproject -c "RAILS_ENV="production" bundle exec rake assets:precompile"

mais cela ne fonctionne pas correctement et à chaque étape demande un mot de passe. Comment améliorer le script traduit pour qu'il fonctionne?

MISE À JOUR 1:

Après avoir reçu des suggestions à ce sujet, je suis au point où le code a été modifié en:

cd ~openproject/openproject

sudo -u openproject git checkout stable

sudo -u openproject git checkout Gemfile.lock
sudo -u openproject git pull

# the output is good thill here
sudo -u openproject bundle install

sudo -u openproject RAILS_ENV="production" bundle exec rake db:migrate
sudo -u openproject RAILS_ENV="production" bundle exec rake db:seed
sudo -u openproject RAILS_ENV="production" bundle exec rake assets:precompile

La sortie est correcte jusqu'à la ligne qui l'indique dans le code. De là, j'obtiens 4 erreurs

sudo: bundle: commande introuvable

MISE À JOUR 2:

Après avoir essayé la suggestion de Dmitry Vasilyanov, j'ai constaté que si j'insère le -i, il simulera la connexion utilisateur. Cependant, ce n'est pas la dernière façon de le faire.

Si je cours echo $PATHaprès m'être connecté en tant que projet ouvert, la sortie est/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Si je cours echo $PATHaprès su openproject -c "bash -l"la sortie/home/openproject/.rvm/gems/ruby-2.1.0/bin:/home/openproject/.rvm/gems/ruby-2.1.0@global/bin:/home/openproject/.rvm/rubies/ruby-2.1.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

codiac
la source
Tu veux sudopas su.
dawud
Vous ne pouvez pas non plus (de manière significative) sudo cd, car il s'agit d'un shell intégré.
MadHatter prend en charge Monica
Mais sudo ne remplace pas pour root? Je suis root et je veux exécuter le script en tant qu'utilisateur openproject, avec des effets exacts comme si je me connectais en tant qu'utilisateur openproject et que je commençais à partir de la deuxième commande (cd ~ / openproject)
1
Non, sudoest utilisé pour s'exécuter en tant qu'autre utilisateur, étant rootla valeur par défaut si rien n'est spécifié, vous pouvez parfaitement l'exécuter sudo -u openproject bundle install.
dawud
Je suppose que vous obtenez l' bundle: command not founderreur parce que vous définissez PATHou GEM_PATHdans votre .bash_profileou .bashrc, ils ne sont pas exécutés dans des shells non connectés / non interactifs, vous devez donc passer -ià sudopour simuler la connexion, comme ceci:sudo -iu openproject bundle install
Dmitry Vasilyanov

Réponses:

19

Pourquoi ne pas créer un script shell et faire un

su - openproject -c "your_shell_script"

Soyez conscient du - avant openproject. Cela définira les variables d'environnement de openproject au lieu de vos variables d'environnement utilisateur.

YoMismo
la source
J'avais besoin d'ajouter sudoau début sinon il m'a demandé mon mot de passe.
IanVaughan
sudodemandera également le mot de passe la première fois que vous l'exécuterez, d'où le conseil de mettre vos trucs dans un script shell et de l'exécuter avec suousudo
YoMismo
8

Si vous utilisez bash, vous pouvez le faire ici-doc

$ su - user -s/bin/bash -c <<EOF
export X=1
echo $X
EOF

De cette façon, vous pouvez exécuter de nombreuses commandes et conserver l'état dans un script.

La même chose avec sudo

sudo -u user bash <<EOF
your
script
here
EOF
spinus
la source
Ni l'un ni l'autre ne fonctionne pour moi. Pouvez-vous vraiment passer des commandes de stdin à su / sudo?
Sparhawk
1
@Sparhawk, merci d'avoir vérifié. Dans le deuxième exemple, j'ai oublié d'ajouter "bash" (déjà mis à jour l'exemple) - fonctionne. Le premier exemple ne fonctionne pas complètement comme vous l'avez mentionné, je tapais à partir du cache à long terme pour que je puisse faire une erreur, mais j'ai certainement dû travailler avec stdin (j'utilisais java pour exécuter le sous-processus pour cette tâche), j'essaierai de testez-le plus pour trouver la bonne façon.
spinus du
1
Je devais créer une commande dépendante de diverses variables et l'exécuter en tant qu'un autre utilisateur. La suggestion de YoMismo n'était donc pas une option dans mon cas. J'ai lutté pendant une heure, et la seule chose que je trouve efficace est l'approche EOF (le deuxième exemple). Merci!
Jette