保持简短;
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,菲律宾5.3
最佳答案
这是可以做到的,sudo的requiretty
选项相对容易被击败,因此它本身并没有增加多少安全性。如果您真的确定要保持打开状态(可能需要支持在默认打开了requiretty
的用户系统上运行脚本?)那么做一个tty可能真的是正确的解决方案。
不过,在直接的php中,这可能是一个巨大的痛苦。我在php.net上搜索了参考文档,没有发现任何迹象表明它有任何用于分配或使用pty的内置实用程序函数。如果您真的想用纯php实现,那么可能需要引用forkpty()调用的glibc源代码(包括它所具有的其他依赖项,如openpty()、getpt()、grantpt()、unlockpt(),等等)。其核心是打开位于/dev/ptmx的伪终端主设备以获取主pt文件描述符,执行chown和tiocstlck ioctl,然后确定/dev/pts中的哪个设备是对应的从fd并打开它。
但我强烈建议在php之外做tty伪造部分,可能是用python弹出一些sudo包装脚本(在pty module中有一些很方便的函数),甚至bash+之类的东西。