这是应该运行的 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 $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
答案1
为什么不创建一个 shell 脚本并执行
su - openproject -c "your_shell_script"
请注意 openproject 之前的 - 。这将设置 openproject 的环境变量而不是您的用户环境变量。
答案2
如果你使用 bash 你可以在这里-doc
$ su - user -s/bin/bash -c <<EOF
export X=1
echo $X
EOF
这样您就可以执行许多命令并将状态保存在脚本中。
与 sudo 相同
sudo -u user bash <<EOF
your
script
here
EOF