Como posso executar como outro usuário?

19

Este é o código do bash que deve ser executado. Então, primeiro ele substitui o usuário pelo projeto aberto e depois executa todo o código

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

Eu tentei chnaging o script acima para isso:

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"

mas isso não funciona corretamente e a cada passo solicita a senha. Como o script traduzido pode ser aprimorado para que funcione?

ATUALIZAÇÃO 1:

Depois de receber sugestões sobre isso, sou o ponto em que o código foi modificado para:

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

A saída é boa até a linha que afirma isso no código. A partir daí, recebo 4 erros

sudo: bundle: comando não encontrado

ATUALIZAÇÃO 2:

Depois de tentar a sugestão de Dmitry Vasilyanov, descobri que, se eu inserir o -i, ele simulará o login do usuário. No entanto, essa não é a maneira final de fazê-lo.

Se eu executar echo $PATHapós efetuar login como projeto aberto, a saída será/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Se eu correr echo $PATHdepois que su openproject -c "bash -l"a saída for/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
fonte
Você quer sudonão su.
Dawud
Você também não pode (significativamente) sudo cd, já que é um shell embutido.
MadHatter apoia Monica
Mas o sudo não substitui como root? Eu sou raiz e deseja executar script como usuário openproject, com efeitos exatos como se eu iria fazer login como usuário openproject e começar do segundo comando (cd ~ / openproject)
11
Não, sudoé usado para executar como outro usuário, sendo rooto padrão se nada for especificado, você pode executar perfeitamente sudo -u openproject bundle install.
Dawud
Eu acho que você está recebendo o bundle: command not founderro porque você definir PATHou GEM_PATHem sua .bash_profileou .bashrc, eles não são executados em conchas não-login / não-interativo, então você precisa para passar -ipara sudoa de login simular, como este:sudo -iu openproject bundle install
Dmitry Vasilyanov

Respostas:

19

Por que você não cria um script de shell e faz um

su - openproject -c "your_shell_script"

Esteja ciente do - antes do projeto aberto. Isso definirá as variáveis ​​de ambiente do openproject em vez das variáveis ​​de ambiente do usuário.

YoMismo
fonte
Eu precisava adicionar sudono início, caso contrário, ele me pedia minha senha.
IanVaughan
sudotambém vai pedir a senha na primeira vez que você executá-lo, daí a aconselhar de colocar suas coisas em um shell script e executar o que quer com suousudo
yomismo
8

Se você usa o bash, pode fazer aqui-doc

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

Dessa forma, você pode executar muitos comandos e manter o estado dentro de um script.

O mesmo com o sudo

sudo -u user bash <<EOF
your
script
here
EOF
spinus
fonte
Nem funciona para mim. Você pode realmente passar comandos do stdin para o su / sudo?
Sparhawk
11
@ Sparhawk, obrigado por verificar. No segundo exemplo, esqueci de adicionar "bash" (já atualizei o exemplo) - funciona. O primeiro exemplo não está totalmente funcionando como você mencionou, eu estava digitando no cache de longo prazo para cometer um erro, mas definitivamente eu estava trabalhando com stdin (eu estava usando java para executar o subprocesso para essa tarefa). testá-lo mais para encontrar o caminho correto.
spinus
11
Eu precisava criar um comando dependente de várias variáveis ​​e executá-lo como outro usuário. Portanto, a sugestão do YoMismo não era uma opção no meu caso. Eu lutei com isso por uma hora, a única coisa que acho que funciona é a abordagem EOF (o segundo exemplo). Obrigado!
Jette