1

保持简短;

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

红帽 6,PHP 5.3

4

1 回答 1

2

这是可以做到的——sudo 的requiretty选项相对容易被打败,所以它本身并没有真正增加太多的安全性。如果您确实确定要保留它(也许您需要支持requiretty在默认开启的用户系统上运行您的脚本?)那么制作 tty 可能确实是正确的解决方案。

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

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

于 2012-04-26T22:39:49.970 回答