使用php用sudo执行命令

时间:2011-12-20 21:02:43

标签: php linux shell exec

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

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

从shell运行时(设置权限并且运行正常而不提供密码),此方法正常。

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

可能导致这种情况的原因是什么?我该如何调试或解决问题?

(php 5.3,redhat,带有~default config的apache)

修改

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

Defaults            requiretty
Defaults:apache     !requiretty

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

  

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

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

如果您迫切需要此信息100%准确且实时,您可能希望采用其他方式来确定新邮件的数量。如果邮箱是可读的 - 例如 - imap或其他什么,PHP具有可以在不需要sudo的情况下进行计算的功能。总而言之,在我看来,无论如何,这似乎是最可重复使用和最“干净”的工作方式。

向sudo'ers文件添加apache存在安全风险,但是,如果你添加它只能执行你希望它能像Quillion描述的那样执行的命令,那么风险会降低。