我创建了一个(系统)用户,例如:mysysuser
和一些 sudo 规则,以便它可以在其他用户文件夹中进行一些维护。
该脚本需要以其他用户身份运行,但也需要一些参数。
因此,我在中创建了以下内容/etc/sudoers.d/mysysuser
例子:
Cmnd_Alias FIRST = /usr/bin/su -l user1 -c '/home/*/www/*/deploy.sh "$0" "$1" "$2"' * * *
Cmnd_Alias SECOND = /usr/bin/su -l user2 -c '/home/*/www/*/deploy.sh "$0" "$1" "$2"' * * *
mysysuser ALL=(ALL) NOPASSWD: FIRST,SECOND
然后我运行:
sudo /usr/bin/su -l user1 -c '/home/user1/www/site1/deploy.sh' "param 1" "param 2" "param 3"
这不起作用并要求输入密码。
这个不带参数的版本运行良好并且无需询问密码即可执行:
Cmnd_Alias FIRST = /usr/bin/su -l user1 -c /home/*/www/*/deploy.sh * * *
但是......脚本没有收到参数。
我知道 sudoers 文件需要它非常字面化,但通配符除外:*
我想知道为什么它不起作用,是:
“$0” “$1” “$2”
部分?
逃避美元符号会让人visudo
呕吐。
更新:
根据评论,建议直接使用 sudo,而不使用 su 命令。
我尝试过这个,但现在我无法让它工作, sudo 要求输入密码,尽管它不应该。
/etc/sudoers.d/mysysuser:
Cmnd_Alias FIRST = /home/*/www/*/deploy.sh "$0" "$1" "$2" * * *
mysysuser ALL=(ALL) NOPASSWD: FIRST
我以 mysysuser 身份执行的命令:
sudo -u user1 /home/user1/www/site1/deploy.sh "param 1" "param 2" "param 3"
结果:
我们相信您已经收到了本地系统管理员的常规讲座。通常可以归结为以下三件事:
#1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility.
[sudo] mysysuser 的密码:
答案1
要运行sudo
你必须运行sudo
:
因此你的命令必须以 开头sudo
。
而且你永远不需要su
与 结合使用sudo
。sudo
可以处理用户和组。您可以配置谁可以运行什么。
答案2
没关系,在 sudoers 文件中没有单引号它也可以正常工作:
Cmnd_Alias FIRST = /usr/bin/su -l user1 -c /home/*/www/*/deploy.sh "$0" "$1" "$2" * * *
用这个命令:
/usr/bin/su -l user1 -c '/home/user1/www/site1/deploy.sh' "param 1" "param 2" "param 3"