使用php执行sudo命令

3

我有一个脚本,调用以下命令获取未读邮件数:

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

当从shell运行时,它可以正常工作(权限设置正确,无需提供密码即可正常运行)。

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

可能是什么原因导致的?如何调试或解决此问题?

(php 5.3,redhat,apache与~默认配置)

编辑

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

Defaults            requiretty
Defaults:apache     !requiretty

但是这似乎不太有利于安全。有其他更好的解决方案吗?

请问如何在PHP的shell_exec中使用sudo命令? - malletjo
PHP是否在与您手动通过shell测试时相同的用户ID下执行? - chrisaycock
1
当您使用exec从PHP运行sudo ls /var/vmail/username/new 2>&1时,会得到什么结果? - ruakh
我已经在问题中添加了一些进一步的细节。 - Sfisioza
3个回答

2
在通过Apache执行PHP时,该进程由Apache运行的用户拥有。参见:查找Apache正在运行的用户。正如在那里提到的那样,通常对于该用户而言,将其添加到sudoers中是一种安全风险。

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中运行的脚本,并查看您得到的错误。


1
但是看起来这对安全性不太好。还有其他更好的解决方案吗?
是的,这是一个安全风险。我不知道这些信息需要多动态;如果您只是偶尔使用它,并且不介意它可能会稍微过时,您可以选择编写一个cronjob,该cronjob将执行命令并将输出写入apache可以读取的临时文件中。
如果您迫切需要此信息保持100%准确并实时更新,您可能需要选择另一种确定新邮件数量的方法。如果邮箱可通过 - 例如 - imap 或其他方式进行读取,则PHP具有可以在不需要sudo的情况下进行计算的函数。总的来说,这似乎是最可重用和“最干净”的工作方式。
将apache添加到sudo'ers文件中是一种安全风险,但是,如果您添加了它只能执行您想要执行的命令,就像Quillion所描述的那样,风险会减少。

看起来最好的选择是仅针对特定命令禁用 tty,就像这里描述的那样,但这对我不起作用。 - Sfisioza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接