簡潔に保つ;
PHPスクリプトを実行し、sudo-ersファイル/etc/init.d/nagios reload
に追加apache ALL = (nagios) NOPASSWD: /etc/init.d/nagios
する必要がありますが、SUDOを使用するにはPHPにTTYが必要です(削除したくないDefaults requiretty
ので、PHPスクリプトの「偽造」またはTTYを作成して、Nagiosをリロードできるようにします。
RedHat 6、PHP 5.3
これは可能です — sudo のrequiretty
オプションは比較的簡単に破ることができるので、それだけではあまりセキュリティが追加されません。本当にオンのままにしたい場合 (おそらくrequiretty
、デフォルトでオンになっているユーザーのシステムでスクリプトを実行できるようにする必要がありますか?)、tty を作成することが本当に正しい解決策かもしれません。
ただし、これはおそらく、ストレートな PHP では非常に大きな苦痛になるでしょう。php.net でリファレンス ドキュメントを検索しましたが、pty を割り当てたり使用したりするためのユーティリティ関数が組み込まれているという兆候は見当たりません。本当に純粋な PHP で実行したい場合は、おそらく forkpty() 呼び出しの glibc ソース コードを参照する必要があります (openpty()、getpt()、grantpt()、 unlockpt() など)。核となるのは、/dev/ptmx にある疑似端末マスター デバイスを open() してマスター PT ファイル記述子を取得し、chown と TIOCSPTLCK ioctl を実行してから、/dev/pts 内のどのデバイスが対応するスレーブであるかを判断することです。 fd を開きます。
しかし、PHP の外で tty 偽造部分を行うことを強くお勧めします。おそらく、Python でいくつかの sudo ラッパー スクリプト ( pty モジュールに便利な関数がいくつかあります) を popen するか、または bash + socatのようなものです。