我正在尝试用 PHP 构建一个防火墙管理器,但是当我执行时,
<?php exec('iptables -L'); ?>
,结果数组为空。
我已经尝试过,
<?php echo exec('whoami'); ?>
,响应是www-data
(Apache正在使用的用户)。我该怎么做才能以 root 身份执行 exec 函数? (最好不要更改 Apache 用户。)
别这样做!您将使自己容易遭受各种恶意黑客攻击。
查看“sudo”文档。
您应该能够将所需的所有命令设置为“sudo”脚本。 编写功能有限的特定脚本比暴露要好得多 底层特权命令。
如:
exec ('sudo getIpTables.ksh')
我知道这是一个老问题
将用户 php running 添加到 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 的手册页
您可以通过phpseclib运行sudo,这是一个纯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]');
?>
您可以将所需的命令放在单独的脚本/可执行文件中(sh,PHP,真正的可执行文件,没关系),将其所有者更改为root,然后对其应用“setuid”。
这将允许任何人和任何人以 root 身份运行此脚本,因此您需要确保它有自己的安全规则,以查看是否允许这样做,并且其功能受到严格限制。
这是非常不安全的,也是一个坏主意。重新思考你的设计。如果您确实想这样做,请按照建议使用 sudo 。另一种解决方案可能是继续以 root 身份运行,但在 chroot 或 vm 映像内执行此操作(两者都可以打破,但仍然如此)。
或者最好的是在 chroot 中以 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;
我遇到了类似的问题,我需要以
git reset --hard
用户身份从 PHP 脚本执行 www-data
等 Git 命令。以下是我如何在不将 PHP 用户更改为 root
的情况下使其工作:
解决方案: 为 Web 目录设置正确的所有权:
确保
www-data
拥有 Web 目录,因此它具有正确的权限:
chown -R www-data:www-data /var/www
配置 Git 以允许安全目录访问:
这可以确保 Git 在通过 www-data 访问时不会引发权限问题:
git config --global --add safe.directory /var/www
授予
www-data
权限,无需密码即可运行 Git 命令:
要允许
www-data
用户通过 sudo 运行 Git 命令,您可以将以下行添加到 sudoers 文件中。建议为此在 /etc/sudoers.d/
下创建一个单独的文件:
echo "www-data ALL=(ALL) NOPASSWD: /usr/bin/git" | sudo tee /etc/sudoers.d/www-data-git
这确保了
www-data
可以以 root 身份运行 git 命令而无需密码。
使用 sudo 从 PHP 执行 Git 命令:
在 PHP 脚本中,使用
sudo
执行 git
命令。这是我使用的命令(示例用法):
$strCommand = "echo '' | sudo -S git -C /var/www reset --hard origin/main 2>&1";
exec($strCommand, $output);
echo implode("\n", $output);
echo '' | sudo -S
:这会向 sudo -S 发送一个空密码,因为 sudoers 配置允许 git 命令在没有密码的情况下运行。
git -C /var/www reset --hard origin/main
:这会重置 Git 存储库以匹配远程分支。
2>&1
:重定向输出和错误消息以进行调试。
总结: 通过此设置,我能够使用 sudo 通过 PHP 作为 www-data 运行 Git 命令,而无需将 PHP 用户更改为 root 或为 sudo 提供密码。这是在 Docker 容器内完成的,但它应该可以在管理特定命令的 sudo 权限的类似环境中工作。
只是一个假设 - 这是一个可以执行此操作的 PHP Web 应用程序吗?这听起来不太安全。需要 root 的应用程序 - 您可以单独构建它,然后从 PHP 调用它吗?如果没有,也许您可以 sudo 该进程,以便它可以以 root 身份运行。