我想使用 下的配置让 PHP 访问非常具体的脚本/etc/sudoers.d
。
所以我做了以下事情:
visudo -f /etc/sudoers.d/99-php
并输入以下 sudo 规则:
www-data ALL = (root) NOPASSWD: /etc/my_script.sh
在/etc/my_script.sh
脚本中我创建了一个文件夹和一些文件,/tmp
然后再次删除它们。
去测试:
su www-data
/etc/my_script.sh
这给了我很多这样的权限错误:
rm: cannot remove «/tmp/my_file.txt»: Access denied
这表明我的脚本实际上根本没有以 root 身份运行。
那么我该怎么做才能让它正常工作呢?
答案1
您必须使用以下命令运行命令须藤。
sudo /etc/my_script.sh
编辑 suduoers 文件并不意味着每次调用脚本都以 root 身份运行,只是表示如果正确调用,它们被允许这样做。
将 shell 脚本放入 /etc 是否有意义是另一个问题。
答案2
首先,正如 dmourati 所说,您仍然需要用 调用脚本sudo
,而不仅仅是运行它。
其次,您真的不应该放入脚本/etc
- 特别是如果这些脚本应该由网络服务器运行。
第三,授予用户以 root 身份运行 shell 脚本的权限几乎等于授予他们完全 root 权限。一旦您获得了这么多 sudo 访问权限,就很容易逃到 shell 中。您不应该将整个 shell 脚本放在 sudoers 文件中,而应该找出 shell 脚本中哪些特定命令需要 root 权限,然后更改脚本以使用 调用这些特定命令sudo
。换句话说,在脚本中,您现在有一行说
rm /tmp/myfile.txt
应该说
sudo rm /tmp/myfile.txt
相应的 sudoers 行应该是
www-data ALL = (root) NOPASSWD: rm /tmp/myfile.txt