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

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

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

相关内容