【问题标题】:Executing commands with sudo using php使用 php 使用 sudo 执行命令
【发布时间】:2012-01-24 19:12:33
【问题描述】:

我有一个脚本,它调用以下命令来获取未读消息的数量:

sudo ls /var/vmail/username/new | wc -l

这在从 shell 运行时可以正常工作(设置了权限并且无需提供密码也可以正常运行)。

但是当使用exec从PHP运行时,它会按预期执行,但它总是返回0

这可能是什么原因造成的?如何调试或解决问题?

(php 5.3, redhat, apache with ~default config)

编辑

感谢ruaks 的提示。问题是:sudo: sorry, you must have a tty to run sudo。注释掉 /etc/sudoers 中的条目有帮助:

Defaults            requiretty
Defaults:apache     !requiretty

但看起来这对安全性不太好。还有其他更好的解决方案吗?

【问题讨论】:

标签: php linux shell exec


【解决方案1】:

当通过 apache 执行 PHP 时,进程归 apache 运行的任何用户所有。请参阅:Finding out what user Apache is running as? 如上所述,该用户在 sudoers 中通常存在安全风险。

【讨论】:

    【解决方案2】:

    这可能是因为你没有配置你的 sudoers。转到 /etc/sudoers 并授予 www-data 执行脚本的权限。所以 vim /etc/sudoers 然后插入 www-data ALL=(root) NOPASSWD: full/script/path.sh 如果您不进行进一步调试,那么当您以 root 身份登录时 su www-数据 然后,一旦您以 www-data 身份登录,尝试运行您在 php 中运行的脚本,看看您得到什么错误

    【讨论】:

      【解决方案3】:

      但看起来这对安全性不太好。还有其他更好的解决方案吗?

      是的,这是一个安全风险。我不知道这些信息需要多么动态。如果你只是偶尔使用它,并且不介意它可能有点过时,你可以选择编写一个 cronjob 来执行命令并将输出写入 apache 可以读取的临时文件。

      如果您迫切需要这些信息 100% 准确且实时,您可能需要另一种方法来确定新消息的数量。如果邮箱可以使用 - 例如 - imap 或其他方式读取,PHP 具有无需 sudo 即可进行计算的函数。总而言之,在我看来,这似乎是最可重用和“最干净”的工作方式。

      将 apache 添加到 sudo'ers 文件是一种安全风险,但是,如果您添加它只能执行您希望它能够像 Quillion 描述的那样执行的命令,风险就会降低。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多