站内公告:

我们的虚拟社区正式开通了

Main Menu

通过PHP执行系统命令

作者 jvip_chen, 2022-5月-09 02:56 下午

« 上一篇主题 - 下一篇主题 »

jvip_chen

PS.这几天用PHP写了一个小工具,因为要部署在Linux,又要暂时使用sudo执行一些Shell命令,网上也有很多资料,但是有的要么就直接把Web服务器用户直接提升权限,要么就使用密码存文件方式,安全性都不是特别好,好在搜索到在Wordpress上一位外国友人的文章,很实用,安全性也不错,就把它翻译过来和大家分享一下,下面是正文部分。

  许多时候我们需要在Linux系统上执行系统命令--比如来删除一个目录或者重启服务。但是,因为Apache并不是以root权限运行的,这样使用PHP的exec()、system()或者passthru()函数来实现以上功能就变得不太可能。

  解决这个问题的方案是非常简单的,特别是在Ubuntu上。Apache的用户www-data需要获得权限来使用sudo执行一些应用。

  1、执行命令

command sudo visudo
  2、在文件末尾,增加如下内容

www-data ALL=NOPASSWD: /sbin/iptables, /usr/bin/du
  假设你希望使用超级用户(root)权限运行iptables和du命令。但是,如果你想使用超级用户权限运行每一个应用,添加以下命令来代替上面的命令。 

www-data ALL=NOPASSWD: ALL
  3、就是这样,现在像下面这种方式在你的php脚本中使用exec()函数

exec("sudo iptables -P FORWARD ACCEPT");
  这使我能够在服务器上执行脚本,这个脚本我早先不得不使用setuid和联合是否为cron的方式。但是现在,PHP使这变得方便。
PS.

1、修改sudoers还有另外一种方式,使用 vi /etc/sudoers,在此之前要 sudo chmod u+w /etc/sudoers,获取权限。

2、如果要让PHP运行我们自己写的脚本,我在Google上看到用这个方法也是可以的。例如:www-data ALL=NOPASSWD: /tmp/script.sh

     要写明sh文件的具体位置