
我试图确保在运行脚本时它作为特定用户运行,而不必在脚本运行之前 su 到该用户。该脚本还使用几个标志运行,例如
./myscript.sh -e dev -v 1.9
我尝试过以下方法
[ `whoami` = myuser ] || exec sudo -S su - myuser -c "bash `pwd`/`basename $0` $@"
但是 -v 标志应该是我的脚本的输入,但它正在作为 su 的输入。所以它抱怨一个无效的选项,有没有办法纠正上述问题?
注意:运行脚本的人具有 sudo 权限。
答案1
当前用户已在变量中$USER
。所以你需要的是:
[ "$USER" = "myuser" ] || sudo -u myuser $0 "$@"
没有必要对于sudo su
,sudo
可以做你需要的一切。您也不需要pwd
or basename
,$0
变量已经具有脚本的完整路径。
您原来的命令是启动登录 shell ( su -
)。如果确实需要(这看起来很奇怪),你可以这样做:
[ "$USER" = "myuser" ] || sudo -iu myuser $0 "$@"
答案2
您的脚本有两个问题:
1)你忘记了测试命令中的空格[`whoami` = myuser]
2) 由于变量“$@”分两步扩展,引用丢失。
以下似乎适用于我的系统:
[ `whoami` = myuser ] || exec sudo -S -u myuser bash -- "$0" "$@"
答案3
如果整个脚本需要由特定用户运行,然后我会将其留给运行脚本的用户来安排以他们认为合适的任何方式更改为正确的用户身份(无论是通过su
、sudo
或其他方式)。
这将简化您的脚本并使其更易于使用。特别是,它将避免必须“纠正”用户无法假设正确身份的情况。就我个人而言,我会将其视为调用中的错误,类似于未能使用正确的命令行选项。
显然,该脚本仍然可以检查以确保它由正确的用户运行:
if [ "$USER" != "correctuser" ]; then
echo 'Must be run by "correctuser"' >&2
exit 1
fi
然后,普通用户将使用以下命令运行该脚本
sudo -u correctuser ./script.sh -e dev -v 1.9
而 root 用户可能想做
su correctuser -c ./script.sh -e dev -v 1.9