我试图建立一个PHP防火墙管理员,但是当我执行, <?php exec('iptables -L'); ?>
<?php exec('iptables -L'); ?>
,结果数组为空。
我曾尝试, <?php echo exec('whoami'); ?>
<?php echo exec('whoami'); ?>
,并且响应是www-data
(Apache是否使用用户)。 我能做些什么来执行exec函数的根? (优选地,在不改变Apache用户)。
我试图建立一个PHP防火墙管理员,但是当我执行, <?php exec('iptables -L'); ?>
<?php exec('iptables -L'); ?>
,结果数组为空。
我曾尝试, <?php echo exec('whoami'); ?>
<?php echo exec('whoami'); ?>
,并且响应是www-data
(Apache是否使用用户)。 我能做些什么来执行exec函数的根? (优选地,在不改变Apache用户)。
不这样做! 你将自己放任自由,对各种恶意两轮牛车的。
看看在“命令”的文档。
您应该能够建立你需要的“命令”能够脚本的所有命令。 这是更好的写功能有限的特定的脚本,而不是暴露底下priviledged命令。
如:
exec ('sudo getIpTables.ksh')
您可以通过执行sudo phpseclib,纯PHP SSH实现 :
<?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 -S,这样你就可以通过回声通过密码
$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把作为建议。 另一种解决方案可能是继续前进,以root身份运行,但这样做的一个chroot或VM映像(两者都可以被折了,但仍然)内。
或者,最重要的是作为一个chroot内部运行sudo的!
除非你使用suphp并配置它以root身份运行,你将无法代表除了谁是运行PHP任何其他系统用户的身份运行任意PHP脚本。
只是一个小想法。 添加队列过程以某种方式和运行的cron在根的crontab过程。
请请非常小心这一点。 任何注射可以从字面上破坏系统。
你可以把所需的命令在一个单独的脚本/可执行文件(SH,PHP,一个真正的可执行文件,无所谓),改变其所有者为root,并申请“的setuid”给它。
这将允许任何东西,任何人都可以运行该脚本的根,所以你需要确保它有它自己的安全规则,看是否这是允许的,并且在它的作用是非常有限的。
我最近出版的一期工程,使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;
只是一个假设 - 这是一个PHP的Web应用程序,将做到这一点? 这听起来不是很安全。 需要根的应用程序 - 你可以建立一个独立,然后从PHP调用它? 如果没有,也许你可以sudo的过程,因此它可以以root身份运行。