我正在尝试使用 PHP 的shell_exec
功能来控制系统服务:
shell_exec('sudo /usr/sbin/service icecast2 stop');
但我可以让它工作的唯一方法是允许所有用户 root 访问以下服务/etc/sudoers
:
ALL ALL=(root) NOPASSWD: /usr/sbin/service
这显然是一个非常糟糕的主意,但如果我尝试将其设置为其他任何内容,它就会拒绝运行,因为该服务需要 root 权限,例如:
%www-data ALL=(root) NOPASSWD: /usr/sbin/service
%www-data ALL=NOPASSWD: /usr/sbin/service
另外,回声posix_getpwuid(posix_geteuid())['name'];
给了我一个正在运行的进程的不同名称 - 不是 www-data。但这些都不起作用:
%myphpuser ALL=(root) NOPASSWD: /usr/sbin/service
%myphpuser ALL=NOPASSWD: /usr/sbin/service
我还尝试编写一个 bash 脚本来控制该服务并从 shell_exec 调用它,但是无法运行。
有人能想到任何其他解决方案,这样我就不会像这样开放我的服务吗?
例如,只允许访问此特定服务和功能?
编辑
取得了一些进展。这可行,但是这足够安全吗?
myphpuser ALL=(ALL:ALL) ALL
myphpuser ALL=NOPASSWD: /usr/sbin/service
还应该提到的是,调用它的 php 脚本是由 cron 作业运行的,无论如何它都不是公开的。