![非交互式脚本中的 sudo](https://linux22.com/image/5439/%E9%9D%9E%E4%BA%A4%E4%BA%92%E5%BC%8F%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%20sudo.png)
我有一个执行三个功能的脚本:A && B && C
.
函数B
需要以超级用户身份运行,而 whileA
则C
不需要。
我有几个解决方案,但这些都不能令人满意:
sudo 整个脚本:
sudo 'A && B && C'
如果不需要的话,以超级用户身份
A
运行似乎是一个坏主意C
使脚本具有交互性:
A && sudo B && C
我可能必须输入密码,但我希望我的脚本是非交互式的,因为每个函数都可能需要一些时间,而且我不希望脚本等待我。嗯,这也是为什么它首先是一个脚本,所以我不必看着它运行。
愚蠢的解决方案:
sudo : && A && sudo -n B && C
首先,首先运行一个空操作似乎很愚蠢
sudo
,而且我必须祈祷 A 不会花费超过$sudo_timeout
。假设的解决方案(我希望你告诉我它存在):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
这会在开始时提示我输入密码,然后仅在需要时使用该凭据。
您对这一切有何看法?我很惊讶这个问题没有解决方案,因为我认为这是一个非常常见的问题(怎么样make all && sudo make install
)
答案1
将脚本添加到/etc/sudoers
具有该NOPASSWD
属性的文件中,以便允许其运行而无需提示输入密码。您可以将其绑定到特定用户(或一组用户),或者允许sudo
系统上的任何人运行它。
名为的脚本的示例行/usr/local/bin/bossy
可能看起来像这样
ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy
然后你会使用这样的东西
A && sudo bossy && C
对于这个例子,我假设PATH
包括/usr/local/bin
.如果没有,则只需使用脚本的完整路径,即sudo /usr/local/bin/bossy
答案2
我认为您可以做的最好的事情是使用 启动脚本,然后使用或sudo
显式启动您想要作为普通用户运行的进程:su user
sudo -u user
#!/usr/bin/env bash
## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)
## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $UID -ne 0 ]
then
echo "The script needs to run as root" && exit 1
fi
## Run the job(s) that don't need root
sudo -u $usr commandA
## Run the job that needs to be run as root
commandB
答案3
您可能想要使用该!requiretty
选项sudo
以及该NOPASSWD
选项。但请记住,这会降低安全性。
答案4
傻点吧。使用很多行。
if A; then
if sudo B ; then
C
fi
fi