2011-11-03 78 views
1

保持简洁;PHP为sudo创建'假'TTY

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

的RedHat 6,PHP 5.3

+0

你应该在'screen'或'expect'上调用它。甚至不知道如何以编程方式设置伪tty,但在PHP中这绝对不可能。 – mario

+0

看看这个:[管数据到Linux程序,期望TTY(终端)](http://stackoverflow.com/questions/4233808/piping-data-to-linux-program-which-expects-a- TTY末端) – jcubic

回答

2

这是可以做到,须藤的requiretty选择是比较容易被破坏,所以它并没有真正通过自己增加多少安全性。如果你是真的确定你想保留它(也许你需要支持在默认情况下在用户的系统上运行脚本requiretty?),然后使一个tty可能真的是正确的解决方案。

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

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