Como posso executar como outro usuário?

18

Este é o código bash que deve ser executado. Então, primeiro ele substitui o usuário por openproject e então 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 incluir o script acima nisso:

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 em todas as etapas pede senha. Como o script traduzido pode ser melhorado para que funcione?

UPDATE 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 está ok até a linha que indica isso no código. De lá eu recebo 4 erros

sudo: bundle: command not found

UPDATE 2:

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

Se eu executar echo $PATH após o login como openproject, a saída será /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Se eu executar echo $PATH após su openproject -c "bash -l" , a saída será /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

    
por codiac 16.07.2014 / 11:02

2 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.

    
por 17.07.2014 / 12:21
7

Se você usar bash você pode fazer aqui-doc

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

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

O mesmo com o sudo

sudo -u user bash <<EOF
your
script
here
EOF
    
por 25.05.2015 / 13:45