如何以其他用户身份运行?


19

这是应运行的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:

在收到有关此问题的建议后,我将代码修改为:

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 $PATH以openproject登录后运行,则输出为/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

如果我echo $PATHsu 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,因为它是内置的shell。
MadHatter支持Monica 2014年

但是sudo不能代替root吗?我是root用户,并且想以openproject用户身份运行脚本,具有确切的效果,就像我将以openproject用户身份登录并从第二条命令(cd〜/ openproject)开始一样

1
否,sudo用于以其他用户身份运行,root如果未指定,则为默认值,您可以完美执行sudo -u openproject bundle install
dawud

我猜你所得到的bundle: command not found,因为你设置错误PATH或者GEM_PATH在你.bash_profile.bashrc他们没有在非登陆/非交互shell执行,所以你需要传递-isudo来模拟登录,就像这样:sudo -iu openproject bundle install
梅德Vasilyanov

Answers:


19

为什么不创建一个shell脚本并做一个

su - openproject -c "your_shell_script"

注意-在openproject之前。这将设置openproject的环境变量,而不是您的用户环境变量。


我需要sudo在开始时添加,否则它将要求我输入密码。
IanVaughan 2015年

sudo也会在您首次运行密码时询问您的密码,因此建议您将您的内容放入shell脚本中,然后使用susudo
-YoMismo

8

如果您使用bash,则可以在此处执行操作

$ 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”(已经更新了示例)–有效。第一个示例没有像您提到的那样完全正常工作,我正在从长期缓存中键入内容,所以我可能会犯一个错误,但是绝对可以使用su与stdin一起工作(我正在使用Java运行该任务的子进程),我将尝试对其进行更多测试以找到正确的方法。
脊髓2015年

1
我需要创建一个依赖于各种变量的命令,然后以另一个用户身份运行它。因此,就我而言,YoMismo的建议不是一个选择。我为此奋战了一个小时,我发现唯一可行的方法是EOF方法(第二个示例)。谢谢!
杰特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.