在 bash 脚本中,如何使用 su 从 root 用户更改为另一个用户,然后退出?

在 bash 脚本中,如何使用 su 从 root 用户更改为另一个用户,然后退出?

我看过如何在脚本内运行“sudo”命令?但这似乎是一个不同的问题。

我想运行一个脚本,使用从 root 更改为 mastodon 用户su,运行 Rails 命令,然后退出回到 root 帐户并重新启动 mastodon。

手动,我可以通过 以 root 身份登录,这样我就可以得到shell。然后我使用切换到 mastodon 帐户(系统不会提示我输入密码),然后。然后我可以运行 Rails 命令等,它们都可以正常工作,然后我就可以运行。ssh [email protected]root@Mastodon:~#sudo su - mastodoncd liveexitsystemctl restart mastodon-*

但是我的 shell 脚本却无法执行相同的操作。restartall脚本如下:

#!/bin/bash

sudo su - mastodon

cd live

RAILS_ENV=production bundle exec rake tmp:cache:clear

RAILS_ENV=production bundle exec rails assets:generate_static_pages

RAILS_ENV=production bundle exec rails assets:precompile

exit

systemctl restart mastodon-*

我是这样运行的 root@Mastodon:~# ./restartall

终端用户和路径更改为mastodon@MyMastodon,但仅此而已;脚本失败: ./restartall: line 5: cd: live: No such file or directory

我也试过root@Mastodon:~# sudo ./restartall

我在使用su更改用户时做错了什么mastodon

只需正确使用就能exit让脚本恢复到root@Mastodon以前的样子systemctl restart mastodon-*吗?

答案1

失败的原因是sudo su - mastodon开始一个新的交互的shell 为用户mastodon。 在该 shell 退出之前,不会执行后面的任何命令。

su您可以通过其选项将命令传递给它-c,如上一个问题所述su 之后,脚本停止工作, 所以

#!/bin/bash

sudo su -l mastodon -c '
  cd live
  RAILS_ENV=production bundle exec rake tmp:cache:clear
  RAILS_ENV=production bundle exec rails assets:generate_static_pages
  RAILS_ENV=production bundle exec rails assets:precompile
'

systemctl restart mastodon-*

(你不需要exit在命令的末尾显式地传递,-c因为-当交互式sushell 运行完要执行的命令时,它将自然退出)。

或者,您可以使用此处文档su通过标准输入将命令传递给 shell,如如何编写一个脚本,在不使用 -c 的情况下在 su 之后运行命令但请注意警告关于从标准输入读取的命令。

但是,你可以考虑su完全避免,并编写脚本,以便检查谁在运行它,并在需要时以目标用户的身份重新执行,例如

#!/bin/bash

rails_user=mastodon

if [[ $EUID -ne $(id -u $rails_user) ]]; then
  echo "Switching to user '$rails_user' to perform tasks"
  exec sudo -iu "$rails_user" "$(realpath $0)"
fi

cd live
# etc.

相关内容