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

如何从需要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

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

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

我想通过
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服务器。