2011-11-03 48 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之類的東西。