如何用exec PHPclosuresUbuntu

我真的需要用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用户可以访问的地方。
  • 设置副本的SUID位,以便它可以作为根运行。 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");