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

时间:2009-10-21 01:08:22

标签: php security unix shell

我正在尝试在PHP中构建防火墙管理器,但是当我执行<?php exec('iptables -L'); ?>时,结果数组为空。

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

8 个答案:

答案 0 :(得分:34)

不要这样做!你会对各种各样的恶意hackery敞开心扉。

查看“sudo”文档。

您应该能够将所需的所有命令设置为“sudo”脚本。 编写具有有限功能的特定脚本要比公开更好 潜在的特权命令。

如:

exec ('sudo getIpTables.ksh')

答案 1 :(得分:13)

您可以通过phpseclib, a pure PHP SSH implementation运行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]');
?>

答案 2 :(得分:9)

我知道这是一个老问题

将用户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的手册页

答案 3 :(得分:3)

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

编辑:

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

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

答案 4 :(得分:3)

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

或者最重要的是在chroot中运行sudo!

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

我最近发布了一个项目,允许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;

答案 7 :(得分:0)

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