如何从需要 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_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 了)
【参考方案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 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
text 当试图从Jenkins运行shell时,如何解决“sudo:没有tty存在且没有指定askpass程序”