【问题标题】:How to call shell script from php that requires SUDO?如何从需要 SUDO 的 php 调用 shell 脚本?
【发布时间】:2023-11-03 00:56:02
【问题描述】:

我有一个需要 SUDO 才能工作的 bash 脚本文件。

我可以使用 SUDO 从命令行运行它,但系统会提示我输入 SUDO 密码。

我想通过shell_exec 从php 运行这个脚本,但是如果我调用SUDO,它不像命令行那样可以提示我输入密码。有没有办法通过 sudo 调用传递 sudo 的密码?

我该怎么做?

【问题讨论】:

  • 顺便说一句,我是在我自己的 ubunto 10.04 机器上使用 apache2 和 php5 运行这个
  • 您应该考虑更改脚本的权限。例如,您可以将组更改为 apache 用户 (www-data),并授予组执行权限:chgrp www-data script.sh && chmod g+x script.sh
  • @John Isaacks:啊。看一下setuid位:en.wikipedia.org/wiki/Setuid
  • 为什么svn commit 需要root?
  • @John Isaacks :这(几乎)绝对是您的 svn 配置的问题。您不想开始分发对脚本的 root 访问权限来解决它,您最终会得到一个非常不安全的系统。花一些时间在 svn 文档中给自己,并可能“www-admin”访问 svn 存储库的各个部分。 (我自己会告诉你,但我已经好几年没有搞砸 svn 了)

标签: php bash sudo shellexecute


【解决方案1】:

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

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

【讨论】:

  • @ClaudioFerraro 只要网络服务器以www-data 用户身份运行,它将适用于任何网络服务器。
【解决方案2】:

这个问题有多种解决方案。

  • 首先,如果您想要 sudo 的原因仅仅是权限问题,请考虑更改脚本权限(请参阅我在上述问题中添加的评论)。

  • 另一种方法是使用 setuid bit [编辑:看起来 setuid 不适用于脚本。解释见this link。]

  • 第三种但非常不安全的方法是从密码文件中读取密码。 警告:这是非常不安全的,如果还有其他可能,请不要这样做。如果这样做,请尝试将密码文件隐藏在文件夹层次结构中的某个位置。

    <?php
    shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile');
    ?>
    
  • 第四种可能性是在 sudoers 文件中使用 NOPASSWD tag。您应该将此功能限制为您需要的特定命令。

【讨论】:

  • 更改脚本权限不会以root身份运行,并且setuid不适用于脚本
  • 不,它不会以 root 身份运行它,但如果使用 sudo 的原因仅仅是脚本不可执行,它会解决问题。关于 setuid 的事情,看起来你是对的。在那种情况下,请原谅我的错误信息。我找到了一个关于这个主题的有用链接:faqs.org/faqs/unix-faq/faq/part4/section-7.html
  • 天啊。永远不要保存具有根访问权限的密码!这从来都不是好的形式。 @Brian 的回答要好得多:不使用密码。
【解决方案3】:

您可以在您的sudoers 文件中添加类似的内容:

username ALL=NOPASSWD: /path/to/script

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

【讨论】:

  • 这是有道理的,但有一部分让我感到困惑......我到底把username ALL=NOPASSWD: /path/to/script这行放在哪里我的sudoers文件是什么?
  • /etc/sudoers 中,尽管您通常使用visudo 命令来编辑该文件。
【解决方案4】:

最好的安全方法是使用 crontab。即,将所有命令保存在数据库中,例如 mysql 表并创建一个 cronjob 来读取这些 mysql entreis 并通过 shell_exec() 执行。请阅读此link 了解更多详细信息。

  * * * * * killProcess.php

【讨论】: