Come posso eseguire come un altro utente?


20

Questo è il codice bash che dovrebbe essere eseguito. Quindi prima sostituisce l'utente a openproject e quindi esegue tutto il codice:

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

Ho provato a manipolare lo script sopra in questo:

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"

ma questo non funziona correttamente e ad ogni passaggio richiede la password. Come può essere migliorato lo script tradotto affinché funzioni?

AGGIORNAMENTO 1:

Dopo aver ricevuto suggerimenti su questo, sono il punto in cui il codice è stato modificato in:

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

L'output è ok fino alla riga che lo indica nel codice. Da lì ottengo 4 errori

sudo: bundle: comando non trovato

AGGIORNAMENTO 2:

Dopo aver provato il suggerimento di Dmitry Vasilyanov ho scoperto che se inserisco -i simulerà come login utente. Tuttavia, questo non è l'ultimo modo per farlo.

Se corro echo $PATHdopo aver effettuato l'accesso come openproject, l'ouput è/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Se corro echo $PATHdopo su openproject -c "bash -l"l'uscita è/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


Tu vuoi sudono su.
Dawud,

Inoltre, non è possibile (significativamente) sudo cd, poiché è incorporato nella shell.
MadHatter supporta Monica il

Ma sudo non sostituisce root? Sono root e voglio eseguire lo script come utente openproject, con effetti esatti come se accedessi come utente openproject e partissi dal secondo comando (cd ~ / openproject)

1
No, sudoviene utilizzato per essere eseguito come un altro utente, essendo rootl'impostazione predefinita se non viene specificato nulla, è possibile eseguirlo perfettamente sudo -u openproject bundle install.
Dawud,

Credo che si stanno ottenendo l' bundle: command not founderrore perché si imposta PATHo GEM_PATHnel vostro .bash_profileo .bashrc, che non avviene in shell non-login / non interattivo, quindi è necessario passare -ial sudodi login simulare, in questo modo:sudo -iu openproject bundle install
Dmitry Vasilyanov

Risposte:


19

Perché non creare uno script di shell e fare un

su - openproject -c "your_shell_script"

Essere consapevoli del - prima del progetto aperto. Ciò imposterà le variabili di ambiente di openproject anziché le variabili di ambiente dell'utente.


Ho dovuto aggiungere sudoall'inizio altrimenti mi ha chiesto la mia password.
IanVaughan,

sudochiederà anche la password la prima volta che la esegui, quindi il consiglio di mettere le tue cose in uno script di shell e di eseguirle con uno dei due suosudo
YoMismo

8

Se usi bash puoi fare qui-doc

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

In questo modo è possibile eseguire molti comandi e mantenere lo stato all'interno di uno script.

Lo stesso con sudo

sudo -u user bash <<EOF
your
script
here
EOF

Né funziona per me. Puoi davvero passare i comandi da stdin a su / sudo?
Sparhawk,

1
@Sparhawk, grazie per il controllo. Nel secondo esempio ho dimenticato di aggiungere "bash" (già aggiornato l'esempio) - funziona. Il primo esempio non funziona completamente come hai detto, stavo scrivendo dalla cache a lungo termine in modo da poter fare un errore, ma sicuramente avevo su su lavorando con stdin (stavo usando Java per eseguire sottoprocessi per quell'attività) Proverò a testalo di più per trovare il modo corretto.
spinus,

1
Avevo bisogno di creare un comando dipendente da varie variabili ed eseguirlo come un altro utente. Quindi il suggerimento di YoMismo non era un'opzione nel mio caso. L'ho combattuto per un'ora, l'unica cosa che trovo funzionante è l'approccio EOF (il secondo esempio). Grazie!
Jette il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.