如何从需要SUDO的php调用shell脚本?
我有一个文件是bash脚本,需要SUDO才能工作 我可以使用SUDO从命令行运行它,但是会提示我输入SUDO密码 我想通过如何从需要SUDO的php调用shell脚本?,php,bash,sudo,shellexecute,Php,Bash,Sudo,Shellexecute,我有一个文件是bash脚本,需要SUDO才能工作 我可以使用SUDO从命令行运行它,但是会提示我输入SUDO密码 我想通过shell\u exec从php运行这个脚本,但是如果我调用SUDO,它不像命令行那样提示我输入密码。有没有办法通过sudo调用传递sudo的密码 如何执行此操作?编辑sudoers文件(使用visudo)并添加允许web服务器用户在不使用密码的情况下运行命令的规则。例如: www-data ALL=NOPASSWD: /path/to/script 您可以在sudoers
shell\u exec
从php运行这个脚本,但是如果我调用SUDO,它不像命令行那样提示我输入密码。有没有办法通过sudo调用传递sudo的密码
如何执行此操作?编辑sudoers文件(使用visudo
)并添加允许web服务器用户在不使用密码的情况下运行命令的规则。例如:
www-data ALL=NOPASSWD: /path/to/script
您可以在
sudoers
文件中添加类似的内容:
username ALL=NOPASSWD: /path/to/script
这将允许特定用户在特定脚本上调用
sudo
,而无需提示输入密码。有多种解决方案
-
<> >首先,考虑改变脚本权限,如果您想要sudo的原因仅仅是一个权限问题(参见上面添加的注释)。
- 另一种方法是使用。[编辑:看起来setuid与脚本不兼容。有关解释,请参阅。]
- 第三种但非常不安全的方法是从密码文件中读取密码警告:这是非常不安全的,如果还有其他可能性,请不要这样做。如果您这样做了,请尝试将密码文件隐藏在文件夹层次结构中的某个位置
<?php shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile'); ?>
- 第四种可能是在sudoers文件中使用。您应该将此功能限制为所需的特定命令
- 最好的安全方法是使用crontab。ie将所有命令保存在一个数据库中,比如mysql表,并创建一个cronjob来读取这些mysql entries,然后通过shell_exec()执行。请阅读本文以了解更多详细信息
* * * * * killProcess.php
顺便说一下,我用ApACE2和PHP5在我自己的UBOTO 10.04机器上运行这个程序,你应该考虑改变脚本的权限。例如,您可以将组更改为apache用户(www-data),并授予组执行权限:
chgrp www-data-script.sh&&chmod g+x script.sh
@John Isaacks:Ah。看看setuid位:为什么svn提交
需要root?@John Isaacks:这(几乎)肯定是svn配置的问题。如果您不想开始分发对脚本的根访问权来解决这个问题,那么最终将得到一个强大的不安全系统。花一些时间在svn文档中,让您自己,甚至“www admin”访问svn存储库的各个部分。(我自己会告诉你,但我已经好几年没有搞乱svn了)这是有道理的,但有一部分让我困惑。。。我应该将行username ALL=NOPASSWD:/path/to/script
放在哪里?在/etc/sudoers
中,尽管您通常使用visudo
命令编辑该文件。更改脚本权限不会以root身份运行,setuid也不会对scripts起作用。不,它不会以root身份运行,但是,如果sudo使用的原因仅仅是脚本不可执行,那么它将解决这个问题。关于setuid的事情,看起来你是对的。那样的话,请原谅我的误传。我发现了一个关于这个主题的有用链接:omg。永远不要保存具有ROOT访问权限的密码!这从来都不是好的形式@Brian的答案要好得多:不用密码。@ClaudioFerraro只要web服务器作为www-data
用户运行,它就可以用于任何web服务器。