我看过如何在脚本内运行“sudo”命令?但这似乎是一个不同的问题。
我想运行一个脚本,使用从 root 更改为 mastodon 用户su
,运行 Rails 命令,然后退出回到 root 帐户并重新启动 mastodon。
手动,我可以通过 以 root 身份登录,这样我就可以得到shell。然后我使用切换到 mastodon 帐户(系统不会提示我输入密码),然后。然后我可以运行 Rails 命令等,它们都可以正常工作,然后我就可以运行。ssh [email protected]
root@Mastodon:~#
sudo su - mastodon
cd live
exit
systemctl 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
因为非-当交互式su
shell 运行完要执行的命令时,它将自然退出)。
或者,您可以使用此处文档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.