如何以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);
如果你遇到path问题 – 使用
"bash -lc 'echo your_passwd | /usr/bin/sudo -S your command'"
所以你得到一个新的bash,就像一个loginshell,并设置path
检查sudo的手册页
这是非常不安全的,也是一个坏主意。 重新思考你的devise。 如果你真的想这样做,build议使用sudo。 另一种解决scheme可能是继续前进并以root身份运行,但是在chroot或虚拟机映像中这样做(两者都可以被打破,但是仍然可以)。
或者最好在chroot里面sudo运行!
除非使用suphp并将其configuration为以root身份运行,否则除了运行PHP的用户之外,您将无法代表任何其他系统用户运行任何PHP脚本。
编辑:
只是一个小想法。 以某种方式添加一个队列进程,并在root的crontab中运行一个cron进程。
请注意这一点。 任何注射都可以从字面上破坏系统。
您可以将所需的命令放在单独的脚本/可执行文件(sh,PHP,真正的可执行文件,无所谓)中,将其所有者更改为root,并将“setuid”应用于该文件。
这将允许任何人和任何人以root身份运行此脚本,因此您需要确保它具有自己的安全规则,以便查看是否允许这样做,并且在其function方面受到严格限制。
只是一个假设 – 这是一个PHP的Web应用程序,将这样做? 这听起来不太安全。 需要root的应用程序 – 你可以单独构build,然后从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;