【问题标题】:PHP create 'fake' TTY for sudoPHP 为 sudo 创建“假”TTY
【发布时间】:2011-11-03 12:29:22
【问题描述】:

保持简短;

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

【问题讨论】:

标签: php linux sudo tty


【解决方案1】:

这是可以做到的——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 module 中有一些很好的方便函数),甚至是 bash + @987654322 之类的东西@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多