我有一个脚本,用于在用户的主目录中执行几个命令。这些文件归用户所有,Apache(www-data
组)仅对它们具有读取权限。该脚本需要由 PHP 通过 按需执行exec()
,并执行一些文件删除/解压操作,但由于 Apache 对目录没有写入权限,因此操作失败。
我尝试过sudoers
像这样编辑该文件:
www-data ALL=(user) NOPASSWD: /bin/su user -c /home/user/bin/script.sh
但它提示我输入用户密码
我也尝试过
www-data ALL=(root) NOPASSWD: /usr/bin/sudo su user -c /home/user/bin/script.sh
但会提示输入www-data
密码sudo
我如何才能让它在没有密码的情况下工作?
答案1
最后用这一行代码让它工作了:
www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh
因为我的脚本需要参数,所以我必须在行尾添加“shell 样式的通配符”:
www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u user /home/user/bin/script.sh [[\:alpha\:]]*
这并不是我所寻找的,但它确实有效(即我的参数以字母开头,但实际上我希望表达式仅匹配字母数字字符、破折号和句点)。
我对 shell 通配符和 POSIX 字符类一点都不熟悉,我使用的基本上是从 sudoers 手册中复制粘贴的。任何知道如何将它们应用于此类问题的人,请留下您的评论!
答案2
为什么在 sudo 里面运行 su?(或者更糟的是,在 sudo 里面运行 sudo)
www-data ALL=(user) NOPASSWD: /bin/bash /home/user/bin/script.sh
这应该可行。
答案3
答案4
我对此采取了不同的方法,允许 apache 用户对指定用户进行 sudo,然后该用户可以运行所有命令(或者如果您只需要一个或几个命令,则可以指定一个列表。
APACHEUSER ALL=(USERNAME) ALL
Defaults:APACHEUSER targetpw
Defaults:APACHEUSER !requiretty
这允许使用以下代码(例如从数据库读取)发送密码:
echo password | sudo -u username -S bash -c command_here arguments_here
只需确保您为此使用专用用户,并且不要将该用户放在 wheel 组中。
也可以看看这里
吉尔特