我真的需要用PHP execclosuresubuntu。 但我可能有一些权限问题。
echo exec('whoami')
返回“无人”;
所以我把控制台
adduser nobody admin
并尝试
exec("shutdown -h now");
但它不工作;(
给用户PHP作为根权限运行是非常危险的 。 这根本不是一个好主意,因为如果PHP脚本中的漏洞被利用,你就会打开整个服务器。 在生产服务器上,这是绝对不可接受的。
唯一能够安全地做到这一点的方法是,我知道有一个cron作业每分钟都以root身份运行一个shell脚本。 shell脚本测试是否存在像shutdown_now.txt
这样的文件。 如果文件存在,脚本将启动关机程序。 PHP脚本会根据指示创建关闭文件。
我不太熟悉shell脚本来提供一个例子,但是如果有必要的话,我确信有人可以。
其实Pekka给了你一个很好的建议。 在你的PHP文件中创建一个文件,将强制重新启动,像简单的东西
$file = fopen('.reboot-server',"w"); fwrite($file, 'reboot'); close($file);
做一个bash脚本来检查那个文件
#!/bin/bash if [ -f /var/www/html/.reboot-server ]; then rm -f /var/www/html/.reboot-server if [ -f /var/www/html/.reboot-server ]; then echo "Can't remove file .reboot-server" else /sbin/shutdown -r now fi fi
并添加它在cronjob下
*/1 * * * * root /home/scripts/reboot.sh
这个答案只是说明性的。 不要这样做。
/sbin/shutdown
(以root用户身份)复制到PHP用户可以访问的地方。 chmod 4755 /copy/of/shutdown
当PHP执行关机的副本时, shutdown
将以root权限运行。 这消除了cron作业,并且过时的“shutdown_now.txt”会导致系统在加电后不久再次暂停。
同样,批次使用setuid位是危险的 。 任何时候使用它, 仔细想想如果滥用程序可能会做什么。 在这种情况下,应用程序中的漏洞可能会导致攻击者远程中止系统。 但是,攻击者可以做到这一点,不管你用什么方法来谈论shutdown
。 如果这是一个可接受的风险,这取决于你。
另外,如果你打算这样做,不要以匿名系统用户的身份运行PHP,你真的需要suexec。 只要确保没有办法任意传递任何你发送的命令。 不要让别人在最后或开始的时候得到&& do_evil_deed
。
一个更安全的方法是通过使用任何一个可用的SSH类,用于连接作为用户在chroot中的用户,而sudo权限仅用于关闭程序。 或者,基本上, 任何时候PHP需要为操作系统做些什么,想象一下为了做到这一点,你可以想到的最小的表面,然后尝试使它更小。
尝试像这样运行exec
exec( 'shutdown -h now', $output, $return_val ); print_r( $output ); echo "\n"; echo 'Error: '. $return_val ."\n";
看看这些错误,我试着用root用户运行一个php脚本,它在我的机器上运行。
如果这不起作用,请考虑让cronjob以root权限运行,定期检查它是否应该在macine上运行关闭。
给那个运行apache的用户授予使用sudo权限运行shutdown的权限?
打开sudoers文件
sudo visudo
添加行
www-data ALL=NOPASSWD:/sbin/shutdown
( www-data应该是运行apache的用户,你可以用ps aux | egrep '(apache|httpd)'
,假设shutdown二进制文件在/ sbin中 )
用ctrl-O保存
现在这应该在PHP中工作:
system("sudo shutdown 0");