2010-01-13 120 views
0

我遇到了一些麻煩,需要像使用php的sudo一樣運行linux命令。這可能使用PHP的exec()?我嘗試過但不能輸入sudo密碼,然後在同一個exec()調用中執行另一個命令。PHP:運行linux命令爲sudo?

編輯:由於自己的愚蠢,我無法通過ssh遠程訪問服務器。這就是爲什麼我必須通過Web服務器運行命令。

回答

2

您可以使用visudo爲給定用戶授予某些命令的某些權限(例如運行Web服務器的用戶......),或者必須設置要運行的程序,但我強烈地使您不願意執行這個。

難道你不能使用更安全的方式,例如在數據庫中寫入數據,並且構建一個守護進程機器人,它經常在數據庫中查找,完成作業,並且可以以root身份授予此守護程序?

1

您應該設置您的sudoers不要求您的PHP運行的用戶使用密碼(NOPASSWD:)。確保完全鎖定該用戶可以通過sudo運行的命令!

+2

使用visudo進行編輯。 – 2010-01-13 21:02:25

+0

vi很痛苦,但是用納米,你可以嚴重搞砸sudoers文件......一次將自己鎖定在ec2實例上,因爲我無法sudo:P – 2012-01-03 04:00:24

+0

@PeteHerbertPenito:你可以在visudo中使用nano。只需將'Defaults editor =/usr/bin/nano'這一行添加到你的sudoers中即可。那麼,以後總是用'visudo'!它爲你做語法檢查。 – 2012-01-03 11:59:51

0

使用proc_open它允許您創建一個自定義管道來提供數據(用戶密碼)。請參閱鏈接上的註釋以瞭解如何創建自定義密碼管道。

更新,因爲你無法閱讀。

片段由雪豹在逗樂點NOSPAMPLEASE點com點AU在05君2008年在02:46以前兩次提到的鏈接評論。你只需要把它應用到你自己的情況。

// Set up the descriptors 
    $Descriptors = array(
     0 => array("pipe", "r"), 
     1 => array("pipe", "w"), 
     2 => array("pipe", "w"), 
     3 => array("pipe", "r") // This is the pipe we can feed the password into 
    ); 

    // Build the command line and start the process 
    $CommandLine = $GPGPath . ' --homedir ' . $HomeDir . ' --quiet --batch --local-user "' . $Identity . '" --passphrase-fd 3 --decrypt -'; 
    $ProcessHandle = proc_open($CommandLine, $Descriptors, $Pipes); 

    if(is_resource($ProcessHandle)) { 
     // Push passphrase to custom pipe 
     fwrite($Pipes[3], $PassPhrase); 
     fclose($Pipes[3]); 
+0

對不起,但我不知道如何使用proc_open。想法? – WhyKiki 2010-01-13 21:06:31

+2

wtf是你的問題?我是新來的PHP,不知道如何做這種事情。混蛋。 – WhyKiki 2010-01-13 21:34:16