다른 사용자로 어떻게 실행할 수 있습니까?


20

이것은 실행되어야하는 bash 코드입니다. 따라서 먼저 사용자를 openproject로 대체하고 모든 코드를 실행합니다.

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

위의 스크립트를 다음과 같이 변경하려고 시도했습니다.

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"

그러나 이것은 제대로 실행되지 않으며 모든 단계에서 비밀번호를 묻습니다. 번역 된 스크립트를 어떻게 개선하여 작동시킬 수 있습니까?

업데이트 1 :

이것에 대한 sugestions를받은 후 코드가 다음과 같이 수정 된 시점입니다.

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

코드에 표시된 줄까지 출력이 정상입니다. 거기에서 4 오류가 발생합니다

sudo : 번들 : 명령을 찾을 수 없음

업데이트 2 :

Dmitry Vasilyanov의 제안을 시도한 후 -i를 삽입하면 사용자 로그인으로 시뮬레이션됩니다. 그러나 이것이 마지막 방법은 아닙니다.

echo $PATHopenproject로 로그인 한 후 실행 하면 출력은/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

출력 echo $PATH후 실행하면su openproject -c "bash -l"/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


당신은 원하지 sudo않습니다 su.
dawud

sudo cd는 쉘 내장이기 때문에 (의도적으로) sudo 할 수 없습니다 .
MadHatter는 Monica

그러나 sudo는 루트를 대체하지 않습니까? 나는 루트이고 openproject 사용자로 스크립트를 실행하고 싶습니다. openproject 사용자로 로그인하고 두 번째 명령 (cd ~ / openproject)에서 시작하는 것처럼 정확한 효과를냅니다

1
아니요, sudo다른 사용자로 실행하는 데 사용되며, root아무것도 지정하지 않으면 기본값으로 완벽하게 실행할 수 있습니다 sudo -u openproject bundle install.
dawud

난 당신이 점점 생각 bundle: command not found이 설정 때문에 오류 PATH또는 GEM_PATH당신에 .bash_profile또는 .bashrc당신이 통과해야하므로, 그들은 비 로그인 / 비 대화식 쉘에서 실행되지 않습니다 -isudo: 시뮬레이션 로그인에 다음과 같이sudo -iu openproject bundle install
드미트리 Vasilyanov

답변:


19

쉘 스크립트를 작성하고

su - openproject -c "your_shell_script"

오픈 프로젝트 전-에주의하십시오. 사용자 환경 변수 대신 openproject의 환경 변수가 설정됩니다.


sudo시작시 추가해야 했으며 그렇지 않으면 비밀번호를 묻습니다.
IanVaughan

sudo또한 암호 당신이 그것을 처음 실행할 때, 쉘 스크립트에 물건을 넣고 중 하나와 그 실행의 따라서 조언을 요청합니다 su또는sudo
YoMismo

8

bash를 사용하면 here-doc을 할 수 있습니다

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

이렇게하면 많은 명령을 실행하고 스크립트 내부의 상태를 유지할 수 있습니다.

sudo와 동일

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

나에게도 효과가 없다. 실제로 stdin에서 su / sudo로 명령을 전달할 수 있습니까?
Sparhawk

1
@Sparhawk, 감사합니다. 두 번째 예에서는 "bash"를 추가하지 않았습니다 (이미 예를 업데이트했습니다) – 작동합니다. 첫 번째 예제는 언급 한대로 완전히 작동하지 않습니다. 장기 캐시에서 입력하여 실수를 할 수는 있지만 stdin (Java를 사용하여 해당 작업에 대한 하위 프로세스를 실행하고 있음)으로 작업하고 있습니다. 올바른 방법을 찾으려면 더 많이 테스트하십시오.
spinus

1
다양한 변수에 따라 명령을 작성하고 다른 사용자로 실행해야했습니다. 그래서 YoMismo의 제안은 제 경우에는 선택 사항이 아닙니다. 나는 이것을 한 시간 동안 싸웠고, 내가 찾은 유일한 것은 EOF 접근법 (두 번째 예)입니다. 감사!
Jette
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.