PHP exec()通过web与CLI调用


PHP exec() called via web vs CLI

我试图在PHP中使用exec(),当通过web浏览器和通过命令行shell使用它时,我得到不同的结果。

简单的事情:

<?php exec('mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>

在web浏览器中调用它不会导致任何挂载,通过命令行(php-cli)运行它会导致挂载成功执行。也没有错误被返回到$output数组。所以我没有任何依据。我运行web和cli都作为同一用户,所以它不应该是一个权限问题。SElinux是禁用的,因此不会阻塞任何东西。防火墙也一样——禁用

如何使PHP exec()在web浏览器和通过命令行表现相同的方式?

您只能以root身份挂载分区,也许将www-data(我假设这是运行apache的用户)添加到sudoers将解决问题,但它会给您带来一个很大的安全漏洞。但是由于它是一种服务,所以你不能写密码,所以你必须告诉用户不要向该用户询问密码。

添加到你的sudoers底部:

www-data ALL=NOPASSWD: ALL

并使用命令

<?php exec('sudo mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>

显然这是一个前所未有的安全漏洞

避免这种情况的一种方法可能是使用队列来放置作业,并使用一个服务来处理它,该服务验证作业是否安全,并在必要时挂载作业。

有一个php接口的队列是beanstalk