我正在尝试在PHP中构建防火墙管理器,但是当我执行<?php exec('iptables -L'); ?>
时,结果数组为空。
我试过<?php echo exec('whoami'); ?>
,响应是www-data
(Apache正在使用的用户)。如何以root身份执行exec函数? (最好不要更改Apache用户。)
答案 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运行。