【问题标题】:Unabel to Run BASH Script as Root in PHP Exec无法在 PHP Exec 中以 root 身份运行 BASH 脚本
【发布时间】:2018-02-13 19:34:24
【问题描述】:

我已编辑 sudoers 文件以允许无密码执行相关脚本:

wordpress ALL=(root) NOPASSWD: /home/vgnadmin/createnewsite
Defaults:wordpress !requiretty

这是应该执行命令的代码:

if ($_SERVER["REQUEST_METHOD"] == "POST" && $usernameerr == "" && $sitenameerr == "") {
$username=escapeshellarg($username);
$sitename=escapeshellarg($sitename);
exec("sudo /home/vgnadmin/createnewsite $username $sitename 2>&1", $output, $retval);
    if ($retval == 1) {
            echo "<h1>Script Failed.</h1><br>";
            echo "Error Message:<br>";
            foreach ($output as $line) {
                    echo "$line<br>";
            }

但在输入表单信息并尝试运行脚本时,我收到错误消息:

sudo: PERM_ROOT: setresuid(0, -1, -1): 不允许操作
sudo: 无法初始化策略插件

我检查了journalctl -xe 以查看该命令是否正在运行,或者是否在服务器端产生任何错误并且没有。我错过了什么吗?

其他不是sudo 的命令运行良好(例如ls)。

【问题讨论】:

  • 您的网络服务器在名为wordpress的用户帐户下运行?
  • 不是整个网络服务器,我在 Apache 中使用 AssignUserID 为每个站点设置单独的配额(我正在运行多租户构建)。该命令以“wordpress”用户身份执行,但我通过运行 exec("whoami") 进行了双重检查。
  • 好的,我不熟悉。当 PHP 代码执行时,Apache 正在以 Linux 用户 wordpress 的身份运行?这需要检查。
  • 是的,Abra,我用 whoami 替换了代码,它返回了值“wordpress”。

标签: php bash exec sudo


【解决方案1】:

检查 php.ini 并搜索 disable_functions

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

如果你执行不在那里,你很好。

现在检查您对命令将进行更改的文件和目录的权限/所有权。 使用 apache 或 www-data 用户更新所有权。 更改文件所有权。

根据您的评论,所有权是wordpress apache,请尝试将用户wordpress 添加到sudo。

【讨论】:

  • 好像是空的,我应该把 exec 添加到列表中吗?
  • 该脚本需要以 root 身份运行,因为它会创建一个新的 wordpress 实例,该实例需要新用户新配额新文件/目录并更改这些文件/目录的所有权。
  • [admin@v-wpmp ~]$ sudo ls -l /var/www/home/generatepage 总计 12 -rwxrwxrwx 1 wordpress apache 365 Feb 13 15:18 completed.php -rwxr--r -- 1 wordpress apache 3625 2 月 13 日 19:04 createnewsite -rwxrwxrwx 1 wordpress apache 2699 2 月 13 日 19:44 form.php [admin@v-wpmp ~]$ sudo ls -l /var/www/home
  • 我看不出这将如何解决问题,因为脚本无论如何都应该以 root 身份运行所有命令? wordpress 用户不能创建用户和设置配额,所以目录是我最不担心的。
  • wordpress 用户在 sudoers 文件中设置为使用 NOPASSWD 运行脚本,在 shell 中运行良好。
【解决方案2】:

答案如下:

我们在 apache 2.4 中使用 mpm-itk(版本 2.4.7-02)并且它可以工作 完美。这里唯一要考虑的是新配置 指令

LimitUIDRange

LimitGIDRange

这些指令定义了 mpm-itk 可以使用哪些 UID 和 GID(通过 setuid/setguid)。因为您显然希望它能够成为根, 您的下限必须为 ID 0。以下配置将起作用 这里:

<IfModule mpm_itk_module>
LimitUIDRange 0 6000
LimitGIDRange 0 6000
</IfModule>

请注意,上边框应包含所有用户 UID/GID 您想在配置中使用的组合 分配用户 ID。

请注意,您可以为您拥有的每个虚拟主机配置此项。笔记 同样,您需要 Linux 内核 3.5.0 或更高版本。 https://askubuntu.com/questions/491624/setresuid-operation-not-permitted-when-calling-via-php

在 RedHat 风格中,您需要手动将模块添加到 /etc/httpd/conf/httpd.conf(或您的 conf 文件所在的任何位置)。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2014-04-29
    • 2013-06-29
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多