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

37

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

我尝试了 <?php echo exec('whoami'); ?> ,响应是 www-data(Apache正在使用的用户)。我该怎么做才能以root权限执行exec函数?(最好不要改变Apache用户。)


仅仅以 root 身份运行 Apache 吗?那似乎是唯一的解决方案。 - mauris
@Mauris 要做到那个,你需要将 Apache 以 root 用户身份运行。你确定这是你想要做的吗? - Gabriel Sosa
是的,这就是为什么我非常怀疑我们是否想要这样做。 - mauris
31
仅仅是标题就已经让我非常害怕了! - bobince
你不应该给予www-data root权限,这是一个巨大的安全风险,请参考我的下面的答案作为替代方案。 - confused
8个回答

38

不要这样做!这会让你变得极其容易受到各种恶意黑客攻击。

可以查看“sudo”文档。

你应该能够设置所有需要的命令为可通过"sudo"执行的脚本。 编写具有有限功能的特定脚本比暴露基础特权命令要好得多。

例如:

exec ('sudo getIpTables.ksh')

你可以限制sudo功能。 - LiraNuna
2
当我面临类似问题时,我使用了Sudo解决方案。这些SO问题作为有用的参考:http://stackoverflow.com/questions/113728/php-webpage-doesnt-launch-unix-command-even-after-updated-sudoers https://dev59.com/jUXRa4cB1Zd3GeqPv_SD - Frank Farmer
1
sudo会要求输入密码。我如何通过PHP提供密码?看起来不可能... - Federico Razzoli
1
@Fredrico -- 仔细查看“sudoers”文档,你可以指定用户/组合和命令的NOPASSWD组合。 - James Anderson
1
我认为即使使用sudo,当你需要处理像更改不同于httpd用户的另一个用户的密码这样的事情时,它也是有限制的,例如使用passwd命令。它只是不起作用,因为某些命令需要root权限,而不依赖于sudoers。 - Claudio Ferraro

16

我知道这是一个老问题

如果用户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'"

所以你会得到一个像登录 shell 一样并且已经设置好路径的新 bash

查看 sudo 的 man 手册页


1
救命稻草!谢谢lumos! - GTodorov
我使用Cpanel,通过用户登录SSH,出现以下错误信息:-bash: /usr/bin/sudo: 没有那个文件或目录。 - Nabi K.A.Z.

13

你可以通过phpseclib,一个纯PHP SSH实现来运行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]');
?>

4
你可以将所需的命令放在一个单独的脚本/可执行文件中(sh、PHP、真正的可执行文件无所谓),将其所有者更改为root,并应用“setuid”。
这将允许任何人以root身份运行此脚本,因此您需要确保它具有自己的安全规则以检查是否允许此操作,并且所做的事情非常受限制。

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

编辑:

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

请务必非常小心。任何注入都可能彻底破坏系统。


3
这样做非常不安全,是个坏主意。请重新考虑你的设计。如果你真的想这么做,请按照建议使用sudo。另一个解决方案可能是在chroot或vm镜像中以root身份运行(尽管两者都可以被破解)。最好的方法是在chroot中以sudo身份运行!

2

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

-2

只是一个假设 - 这是一个将执行此操作的 PHP Web 应用程序吗?这听起来不太安全。需要 root 权限的应用程序 - 你能否将其单独构建,然后从 PHP 中调用它?如果不能,也许你可以使用 sudo 命令使该进程以 root 用户身份运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接