【问题标题】:php sudo shell_exec command runs from command line, but not from browserphp sudo shell_exec 命令从命令行运行,但不是从浏览器运行
【发布时间】:2013-07-06 02:30:02
【问题描述】:

我正在使用 php-fpm 运行 lighttpd。我已将 http 用户作为 nopasswd sudoer 添加到我的 sudoers 中。我有以下脚本:

<?php
    echo shell_exec("sudo sh -c 'echo \"wtf3\" > /etc/openvpn/auth.txt'");
?>

当我这样做时它运行良好:

sudo -u http php testsudo.php

但通过浏览器运行时失败。

shell_exec("whoami");

在浏览器中确认我是用户 http。

什么给了?

【问题讨论】:

  • 授予 Web 服务器适当的权限以写入该文件,而无需 root 权限
  • @hek2mgl 不是一个选项。我需要在 etc 中编辑几个配置文件,但我不希望我的网络服务器在这些文件夹中有全权委托,所以它在 sudoers 中设置为只允许一个脚本以 nopasswd 身份运行。
  • 尝试这个时会出现什么错误?
  • 您认为这更安全,但事实并非如此。如果 shellscript 中有错误,那么门是敞开的。创建一个组webmgmt 或其他,将必要文件的组所有权转移到该组,最后将 http 放入该组
  • @Barmar 它没有给我任何错误。它根本没有做任何事情。我希望通过在 shell 中将脚本作为 http 运行来捕获错误,但以这种方式运行时它实际上可以工作。

标签: php bash lighttpd sudo shell-exec


【解决方案1】:

制作一个可以运行您的命令的shell脚本是不可能的吗?

#!/bin/sh
sudo whoami

在php中:

$retVal = `/path/to/custom/script/myscript.sh &2>1`;
if ($retVal) echo 'SWEET';
else echo 'POOP: ' . $retVal;

{command} inside `` 表示与 linux 服务器上的shell_exec('{command}') 相同。 如果我在这里没有偏离基础,您的目标是将用户添加到您的 VPN(也许还有其他事情),在这种情况下,您可以将用户名/密码/等的命令行参数传递给您的自定义 shell 脚本。

对于您的问题,这并不是一个纯粹的 shell_exec() 答案,但也许您可以在不执行 sudo 的情况下运行 myscript.sh。只是基于您说您尝试在 shell 中工作的所有内容,并且路径是在echo $PATH 中设置的,但不是在您的 PHP 脚本中的sudo echo $PATH。似乎出于某种原因 sudo 在 php 中是一个问题,但在 shell 中没有,所以...让我们将 sudo 移回 shell 并尝试这种方式。

【讨论】:

    最近更新 更多