我有一个脚本调用以下命令来获取未读消息的数量:
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
但看起来这对安全性来说并不是那么好。还有其他更好的解决方案吗?
答案 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描述的那样执行的命令,那么风险会降低。