如何从需要 SUDO 的 php 调用 shell 脚本?

Posted

技术标签:

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

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

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

我想通过shell_execphp 运行这个脚本,但是如果我调用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 了) 【参考方案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

【讨论】:

以上是关于如何从需要 SUDO 的 php 调用 shell 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

centos 配置 php 执行shell的权限

text 当试图从Jenkins运行shell时,如何解决“sudo:没有tty存在且没有指定askpass程序”

使用 JSch 的多个命令

如何在 Emacs 中运行 sudo 命令?

sudo:没有 tty 存在,也没有指定 askpass 程序使用 shell_exec 时

从 php 运行可执行文件而不产生 shell