我遇到了同样的问题,最后找到了一个我认为既安全又简单的解决方案。此方法的一个缺点是您必须在发布安全更新时对其进行处理。
我们要做的是制作我们自己的特殊外壳,我们将其 chown 和 SUID 提供给我们希望任务执行的用户。为了保持安全,这个用户应该只是一个没有广泛系统权限的普通用户,并将脚本放在其他不允许的地方。现在我们让 php 执行一个使用这个特殊 shell 的脚本,并且这个脚本中的所有命令都将作为选择的用户执行。
在实践中:
sudo mkdir /usr/lib/specialshell
sudo chown user_who_may_run_command:root /usr/lib/specialshell
sudo chmod 700 /usr/lib/specialshell
sudo cp /bin/perl specialperl
sudo chown user_to_run_command:usergroup_to_run_command specialperl
sudo u+s specialperl
sudo mv specialperl /usr/lib/specialshell
现在我们创建一个名为 command.script 的脚本,其中包含:
#!/usr/lib/specialshell/specialperl
$ENV{"PATH"} = "/usr/bin";
system("/path/to/command");
从我们使用的php代码中:
exec("/path/to/command.script");
等等,没有代码更改,只是 php 中的命令名称。
编辑:仅适用于 perl 作为 shell,因此将 bash 更改为 perl 并将 shell 放在安全的地方