以 PHP 调用的其他用户身份运行 shell 命令

以 PHP 调用的其他用户身份运行 shell 命令

我有一个 PHP 脚本,它通过 HTTP 调用,而不是作为命令行脚本。此脚本应以当前 Web 服务器用户 www-data 以外的其他用户身份调用 shell 命令。

例子:

<?php
echo shell_exec('sudo -u myusername -S /usr/bin/whoami'); // returns nothing :(
echo shell_exec('whoami'); // returns www-data

当调用这两个命令sudo -u myusername -S /usr/bin/whoamiwhoami直接在命令行上时,它们会返回

myusername
www-data 

这也没有结果:

<?php
echo shell_exec('echo "mypass" | sudo -u myusername -S /usr/bin/whoami');

对我来说,sudo 似乎根本不能与 PHP shell_exec() 一起工作。

答案1

首先,我不明白你正在运行的 sudo 命令。 sudo -u username应该允许你(作为用户一)以用户二的身份执行 sudo 命令,方法是说(在此示例中,以用户一的身份运行命令 ls):

sudo -u usertwo ls

如果您尝试通过替换username真实用户名来净化上述命令,我深感抱歉,但我不能确定您是否这样做了,因此我需要首先提出这一点。

其次,必须配置 sudo 以允许用户以其他用户身份执行一系列命令。首先,允许 www-data 以用户 fribble 身份执行 sudo ls 命令;您可以通过输入以下代码进行测试:

www-data        ALL = (fribble) NOPASSWD: ls

在您的 sudoers 文件中(用 fribble 代替真实用户)。然后尝试ls -la /tmp从 PHP 脚本内部执行操作,看看是否能获得目录列表。

我同意 James Lawrie 的观点,允许 www-data 用户以任意用户身份无密码执行 sudo 任意命令并不是一个好主意,但如果你明确说明你试图让 www-data 运行什么命令,这可能是一个明智的方法。

编辑:

您已在 sudoers 文件和sudo -u user2 ls -al /tmpPHP 脚本中尝试使用 ls,并且获得了一个目录列表,这强烈表明 sudo 与 PHP 配合良好。

可以肯定的是,您可以允许/bin/touchsudoers 文件,放入sudo -u user2 touch /tmp/TESTFILEPHP 脚本,然后执行它吗?如果/tmp/TESTFILE出现一个文件,由 user2 拥有,我们可以确定 sudo 和 PHP 可以正常工作。

我必须承认,如果我知道你试图使用 sudo java,我永远不会回答最初的问题,因为我认为 java 是一个巨大的、不可预测的垃圾,如果它没有得到它需要的环境,它的行为就像一个完整的婴儿(而 sudo 相当严格地净化了环境)。但至少上面的测试应该可以帮助你确定,无论这里的问题是什么,它都是不是PHP 和 sudo 不能很好地协同运行的问题。

答案2

不要允许 Web 服务器用户 sudo 访问,否则只会自找麻烦。请检查 setuid 位:
chmod u+s some_file_that_needs_executing_as_another_user.pl
无论何时执行该文件,它都会由创建该文件的用户有效执行。
顺便提一下,我很确定您无法将密码输入 sudo 或 passwd。

答案3

如果您想为以 www-data 用户身份运行的 Web 服务器进程授予特殊权限,您可以执行以下操作之一:

1-将 www-data 添加到 sudoers 文件,以便它可以执行所需的命令/脚本而无需输入密码。

2- 启用 suexec apache 模块。这使您能够将用户从 www-data 更改为每个虚拟主机的其他特权用户。因此,您不需要更改整个服务器的用户。

相关内容