【问题标题】:php shell_exec with sudo commands not working带有 sudo 命令的 php shell_exec 不起作用
【发布时间】:2016-07-22 09:31:52
【问题描述】:

我在 (/opt/lampp/htdocs/xampp/test.php) 中创建了一个文件 test.php 包含代码

$data = shell_exec("sudo php -v"); 
var_dump($data);

但它给了我结果 NULL

我使用的是 PHP 5.6.11-1ubuntu3.1 (cli),所以我也在 /etc/sudoers 文件中添加了一行

www-data ALL=NOPASSWD: /opt/lampp/htdocs/xampp/test.php

我也尝试过添加

www-data ALL=NOPASSWD: ALL

但似乎没有任何效果。请帮忙

【问题讨论】:

  • 试试 'ls' 命令。你有什么收获吗?
  • 它与另一个没有 sudo 的命令一起工作?
  • yes ls 正在工作....实际上以 sudo 开头的命令似乎不起作用...好像我尝试 sudo ls 它不起作用但很简单 ls 正在使用 shell_exec
  • ok 运行 'whoami' 来检查你正在使用的用户
  • 这个用户在 sudoers 中吗?您可以做的最好的事情是登录到您的服务器并执行您正在尝试的确切命令。有结果吗?

标签: php sudoers


【解决方案1】:
  • 编辑 sudoers 文件(使用 visudo)并添加一个规则,允许 Web 服务器用户在没有密码的情况下运行命令。例如:

    www-data ALL=NOPASSWD: /path/to/script
    

    这将允许该特定用户在该特定脚本上调用 sudo 而不会提示输入密码。

  • 尝试指定 php 二进制文件的完整路径。/usr/bin/php,如果您不知道,请使用:which php 查找它

    $data = shell_exec("/usr/bin/php -v"); 
    var_dump($data);
    
  • 你也可以检查你的 php.ini 限制可用的命令集吗?

    ; When safe_mode is on, only executables located in the safe_mode_exec_dir
    ; will be allowed to be executed via the exec family of functions.
    ; http://php.net/safe-mode-exec-dir
    safe_mode_exec_dir =
    

【讨论】:

  • 正如我在问题中提到的那样,我已经尝试过使用 visudo。似乎没有任何效果
【解决方案2】:

您应该更改 mpm_itk 模块的最小 uid/gid:

$ cat /etc/apache2/modules.d/00_mpm_itk.conf
<IfDefine MPM_ITK>
LoadModule mpm_itk_module modules/mpm_itk.so
#  LimitUIDRange 1000 2000
#  LimitGIDRange 1000 2000
  LimitUIDRange 0 2000
  LimitGIDRange 0 2000
</IfDefine>

【讨论】: