如何以root身份运行PHP exec()?

我试图在PHP中build立一个防火墙pipe理器,但是当我执行时, <?php exec('iptables -L'); ?> <?php exec('iptables -L'); ?> ,结果数组是空的。

我试过, <?php echo exec('whoami'); ?> <?php echo exec('whoami'); ?> ,响应是www-data (Apache正在使用的用户)。 我能做些什么来以root身份执行exec函数? (最好不要更改Apache用户。)

不要这样做! 你会留下各种各样的恶意骇客。

看看“sudo”文档。

您应该能够将所需的所有命令设置为“sudo”脚本。 使用有限的函数编写特定的脚本要比暴露底层的特权命令要好得多。

如:

 exec ('sudo getIpTables.ksh') 

您可以通过phpseclib(纯PHP PHP实现)运行sudo:

 <?php include('Net/SSH2.php'); $ssh = new Net_SSH2('www.domain.tld'); $ssh->login('username', 'password'); $ssh->read('[prompt]'); $ssh->write("sudo command\n"); $ssh->read('Password:'); $ssh->write("Password\n"); echo $ssh->read('[prompt]'); ?> 

我知道这是一个古老的问题

如果尚未分配,则将php用户运行添加到sudo组

使用sudo -S,所以你可以通过echo传递密码

 $exec = "echo your_passwd | /usr/bin/sudo -S your command"; exec($exec,$out,$rcode); 

如果你遇到路径问题 – 使用

 "bash -lc 'echo your_passwd | /usr/bin/sudo -S your command'" 

所以你得到一个新的bash,就像一个登录shell,并设置路径

检查sudo的手册页

这是非常不安全的,也是一个坏主意。 重新思考你的设计。 如果你真的想这样做,建议使用sudo。 另一种解决方案可能是继续前进并以root身份运行,但是在chroot或虚拟机映像中这样做(两者都可以分解出来,但仍然可以)。

或者最好在chroot里面sudo运行!

除非使用suphp并将其配置为以root身份运行,否则除了运行PHP的用户之外,您将无法代表任何其他系统用户运行任何PHP脚本。

编辑:

只是一个小想法。 以某种方式添加一个队列进程,并在root的crontab中运行一个cron进程。

请注意这一点。 任何注射都可以从字面上破坏系统。

您可以将所需的命令放在单独的脚本/可执行文件(sh,PHP,真正的可执行文件,无所谓)中,将其所有者更改为root,并将“setuid”应用于该文件。

这将允许任何人和任何人以root身份运行此脚本,因此您需要确保它具有自己的安全规则,以便查看是否允许这样做,并且它的功能是非常有限的。

只是一个假设 – 这是一个PHP的Web应用程序,将这样做? 这听起来不太安全。 需要root的应用程序 – 你可以单独构建,然后从PHP调用它? 如果没有,也许你可以sudo的过程,所以它可以作为根运行。

我最近发布了一个项目,允许PHP获得真正的Bash shell并与之交互。 在这里获取: https : //github.com/merlinthemagic/MTS

下载后,你只需使用下面的代码:

 $shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); $return1 = $shell->exeCmd('iptables -L'); //the return will be a string containing the return of the command echo $return1;