【问题标题】:PHP shell_exec() and sudo: must be setuid rootPHP shell_exec() 和 sudo: 必须是 setuid root
【发布时间】:2010-02-09 15:57:27
【问题描述】:

我有一个shell_exec() 命令可以访问我的文档根目录上方的目录,因此我需要使用 sudo "作为根" 来实现它。 (我了解安全问题并正在采取措施解决它)。

问题是当我运行 shell_exec() 时,我的 apache error_log 文件中出现“sudo: must be setuid root”错误。

我认为解决方案是将我的sheel_exec() 调用的 bash 脚本 chmod 4750 但这不起作用。

究竟什么是“sudo: must be setuid root”试图告诉我,我该如何解决?

【问题讨论】:

    标签: php sudo


    【解决方案1】:

    sudo 可执行文件本身是 setuid 根吗?你可能需要

    chown root: /usr/bin/sudo
    chmod u+s /usr/bin/sudo
    

    【讨论】:

    • ---x--x--x 2 root root 159752 2009 年 2 月 13 日 sudo*
    • 是的,这绝对是您的问题。除了上述之外,您可能还需要chmod a+r /usr/bin/sudo,但绝对需要u+s 这一行。
    • 我想避免为了让脚本运行而不得不进行服务器端调整。原因是我正在构建的内容旨在通过 1 次安装过程推广到其他服务器。所以我不想为了让脚本工作而请求服务器端调整。如果必须是这种情况,那么我可以很容易地让系统管理员加载文件,作为正在运行的安装过程的先决条件。底线,尝试创建独立于服务器配置且自依赖的东西。
    • (接上一条评论)因此,如果 shell_exec() 无法以 root 身份运行,那么我真的很想知道,所以我不会继续旋转我的轮子或有希望它可以。我看过这篇文章 (php.net/manual/en/function.shell-exec.php#68685) 但我无法让它在我的服务器上运行。谢谢
    • sudo 不能在没有 setuid 位 sed 的情况下运行。如果您希望该服务器上的 anything 执行 sudo,那么您需要修复它。
    【解决方案2】:

    或者,完全跳过sudo。如果您的脚本由 root 拥有并且设置了自己的 setuid 位,那么您不需要使用 sudo 来获得 root 权限。事实上,这样会更安全;您保证您的网络用户只能使用该脚本,而无需编辑 sudoers。为此,请从您的 shell_exec() 行中删除 sudo:

    <?php
        shell_exec('/path/to/your/command');
    ?>
    

    【讨论】:

    • 我已将脚本设置为 root 拥有。似乎因为脚本是由浏览器调用或调用的,所以“没有人”实际上是运行脚本的用户,而不管 linux 认为谁拥有该文件。
    • 我还没有遇到过需要的情况;特别是,访问父目录不需要 root 权限。您使用的是哪个服务器(和版本)?
    【解决方案3】:

    您是否检查了脚本的权限?

    谁拥有脚本?

    网络用户是否有 sudo 权限?

    【讨论】:

    • 以下是相关文件的权限:

      PHP 脚本从浏览器运行
      -rw-r--r-- 1 drd drd 339 Feb 9 11:09 test.php

      从 shell_exec() 调用的 BASH 脚本
      -rwsr-x--- 1 root nobody 209 Feb 9 09:01 test.bash*
      这里是shell_exec() 命令
      shell_exec('sudo -u root -S /home/drd/public_html/app/shell/test.bash
      回复:您的问题“网络用户是否拥有装备......?”你指的是sudoers吗?我的偏好不是更改 sudoers 文件,而是使用 root。
    • 如何在 StackOverflow 的 cmets 中获得换行符(使用 FF 3.6)?
    • -rw-r--r-- 1 drd drd 339 Feb 9 11:09 test.php
    • -rwsr-x--- 1 root 没有人 209 Feb 9 09:01 test.bash*
    • shell_exec('sudo -u root -S /home/drd/public_html/app/shell/test.bash
    【解决方案4】:

    要解决此问题,您需要以 root 身份 chown 和 chmod sudo 文件,如下所示。

    chown root:root /usr/bin/sudo
    chmod 4111 /usr/bin/sudo
    chmod 0440 /etc/sudoers
    

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2013-09-07
      • 2016-11-13
      • 2016-09-12
      • 2017-01-14
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多