【问题标题】:How to sudo or su to other user as www-data如何以 www-data 的身份向其他用户发送 sudo 或 su
【发布时间】:2019-04-06 05:50:45
【问题描述】:

我正在尝试设置一个运行脚本的网页。问题是,这些脚本必须使用另一个用户运行。这不是权限问题,我可以将脚本作为 www-data 物理运行,但脚本依赖于用户设置的整个框架和环境变量。

我希望向用户发送 sudo 或 su 并在之后运行脚本。

网页调用一个运行的php文件:

$cmd1 = "sudo login -f otheruser";
$cmd2 = "whoami";
echo exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
echo exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";

我尝试过同时使用“sudo login -f otheruser”和“su - otheruser”,我将其设置为从 www-data 登录到 otheruser 不需要密码 (/etc/pam.d/su)

第一个命令什么都不返回,第二个返回:www-data 很明显它没有登录到其他用户。

关于如何做到这一点的任何想法,或者我如何以其他用户身份运行脚本的替代方法?

【问题讨论】:

  • 命令一和二完全不相关。 login不会为你做任何事情,你需要做sudo -u otheruser whoami
  • @miken32 运行 sudo - u otheruser whoami 返回状态 1。这只是 sudo 和 su 不能作为 www-data 工作的一个示例。不知道如何解决这个问题。
  • 通常情况下,您不希望对 www-data 进行 sudo 操作,否则会冒着向世界开放系统的风险。但是,您可以更改要与之交互的文件的权限。
  • 将 SAPI 更改为允许 PHP 作为文件系统上实际文件的拥有用户/组运行的东西。 PHP-FPM 或通过 nginx 而不是 Apache 和 libapache2-mod-php,甚至可能在辅助端口上并使用您的 Apache 代理这些脚本

标签: php sudo user-permissions su


【解决方案1】:

编辑: 所以在看了这个之后,这是因为很多事情。

首先,让我说,很可能有比授予 Apache HTTPD sudoers 访问权限更好的解决方案。

其次,如果您的用户是www-data,我将假设您使用的是某种风格的 Ubuntu。

所以这里是如何使它工作...... 我首先查看的是日志文件。 journalctl -u apache2 -f 跟踪 httpd 日志文件。你会看到很多这样的条目:

Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): conversation failed
Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): auth could not identify password for [www-data]
Nov 02 15:27:17 ubuntu sudo[23541]: www-data : command not allowed ; TTY=unknown ; PWD=/var/www/html ; USER=postgres ; COMMAND=/var/www/html/test2.sh

所以让我们首先创建几个文件进行测试。我们将以尽可能确保这一点的心态进入这一点。因此,我将创建两个测试文件,一个我们想要授予执行权限,一个我们不授予执行权限。

cd /var/www/html
echo -e "#\x21/bin/bash\necho \"Running command: \$0\"\n"  | tee test.sh test2.sh
chown postgres:postgres test*.sh
chmod 700 test*.sh

现在我们要授予www-data 用户对sudo 的访问权限。但是,我们只希望它能够执行命令/var/www/html/test.sh 而不是/var/www/html/test2.sh。所以让我们创建以下文件:

www-data ALL=(ALL) NOPASSWD:/var/www/html/test.sh
echo 'www-data ALL=(ALL) NOPASSWD:/var/www/html/test.sh' > /etc/sudoers.d/www-data

我稍微更新了您的示例 PHP 脚本以提供更多输出:

<?php
$cmd1 = "sudo -u postgres /var/www/html/test.sh";
$cmd2 = "sudo -u postgres /var/www/html/test2.sh";
$cmd3 = "whoami";
echo "Executing command 1: $cmd1\n";
exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
unset($output);
echo "\nExecuting command 2: $cmd2\n";
exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";
unset($output);
echo "\nExecuting command 3: $cmd3\n";
exec(escapeshellcmd($cmd3), $output, $status);
foreach($output as $line) echo "$line\n";
?>

现在,我得到以下信息:

$ curl localhost
Executing command 1: sudo -u postgres /var/www/html/test.sh
Running command: /var/www/html/test.sh

Executing command 2: sudo -u postgres /var/www/html/test2.sh

Executing command 3: whoami
www-data

命令 2 不生成输出,因为 www-data 用户没有执行它的权限。您应该在日志条目中看到以下内容:

Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): conversation failed
Nov 02 15:27:17 ubuntu sudo[23541]: pam_unix(sudo:auth): auth could not identify password for [www-data]
Nov 02 15:27:17 ubuntu sudo[23541]: www-data : command not allowed ; TTY=unknown ; PWD=/var/www/html ; USER=postgres ; COMMAND=/var/www/html/test2.sh

原答案:

我使用了sudo su -c,并且能够获得预期的输出。请参阅以下内容:

$cmd1 = "sudo su -c 'whoami' postgres";
$cmd2 = "whoami";
echo exec(escapeshellcmd($cmd1), $output, $status);
foreach($output as $line) echo "$line\n";
echo exec(escapeshellcmd($cmd2), $output, $status);
foreach($output as $line) echo "$line\n";

输出

$ ./test.php
postgrespostgres
myuserpostgres
myuser

【讨论】:

  • 我的输出:www-datawww-data www-data 这就是我所指的 www-data 无法 sudo/su。
  • @Mr.Kaplan 再次检查。我更新了我的答案以提供一个完整的工作答案,其中包含有关如何使其从头到尾工作的说明。
最近更新 更多