PHP为sudo创建'假'TTY

时间:2011-11-03 12:29:23

标签: php linux sudo tty

保持简短;

PHP脚本需要运行/etc/init.d/nagios reload,将apache ALL = (nagios) NOPASSWD: /etc/init.d/nagios添加到sudo-ers文件中,但要使用SUDO PHP需要一个TTY(我不想删除Defaults requiretty所以我想要“伪造”或为PHP脚本创建一个TTY,以便它可以重新加载Nagios。

RedHat 6,PHP 5.3

1 个答案:

答案 0 :(得分:2)

这可以做到 - sudo的requiretty选项相对容易失败,因此它本身并没有真正增加安全性。如果您确定要将其保留(可能需要支持在默认情况下启用requiretty的用户系统上运行脚本?)那么制作tty可能确实是正确的解决方案。

但是,这可能是直接PHP的巨大痛苦。我在php.net搜索了参考文档,我没有看到任何表明它有任何内置实用程序函数来分配或使用ptys。如果你真的想在纯PHP中实现它,你可能需要为forkpty()调用引用glibc源代码(包括它有的其他依赖项,比如openpty(),getpt(),grantpt(), unlockpt()等)。在其核心,这将涉及在/ dev / ptmx中打开()'伪终端主设备以获得主PT文件描述符,执行chown和TIOCSPTLCK ioctl,然后确定/ dev / pts中的哪个设备是相应的从设备fd并打开那个。

但是我强烈建议在PHP之外做一些tty伪装部分,可能是在Python中编写一些sudo包装器脚本(在pty module中有一些不错的方便功能),甚至是bash +之类的东西socat