我有一个长时间运行的 bash 脚本,其中一些命令需要以 root 身份运行,而大多数命令需要在 sudo 之前以普通用户身份运行,因为它会弄乱文件所有权等。
我想出了一些方法,但每个方法都有一些问题
方法一:在文件中使用sudo
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Run Code Online (Sandbox Code Playgroud)
从代码的编写方式来看,这看起来不错。sudo写在几条实际需要root运行的语句之前,但是如果每次sudo调用之间的时间太长sudo再次要求输入密码。此外,如果第一次执行sudo失败,例如由于密码无效,脚本的其余部分仍会执行。
方法二:使用sudo调用文件,需要时再改回原用户
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Run Code Online (Sandbox Code Playgroud)
这也很糟糕,因为我需要su username -c在几乎每一行之前添加。也sudo可以在之后找到原始用户名,但很麻烦。
有没有更好的办法?
编辑:我只在这里发布了一些小而荒谬的脚本来展示我在说什么。在实际脚本中,我有一些需要 sudo(启动和停止服务)的行,一些行是否有 sudo 无关紧要,还有很多行确实需要在没有 sudo 的情况下运行。
关于方法2,使用函数更容易。例如:
#!/bin/bash
func(){
echo "Username: $USER"
echo " EUID: $EUID"
}
export -f func
func
su "$SUDO_USER" -c 'func'
Run Code Online (Sandbox Code Playgroud)
$SUDO_USER是sudoer 的用户名。你也可以$(logname)在它的位置使用。
在我的机器上运行:
#!/bin/bash
func(){
echo "Username: $USER"
echo " EUID: $EUID"
}
export -f func
func
su "$SUDO_USER" -c 'func'
Run Code Online (Sandbox Code Playgroud)