2013-12-16 33 views
0

我有一個個人的Ubuntu服務器的機器這個PHP代碼 '蘇必須從終端運行':PHP的proc_open:

 

    $cmd = 'su testuser'; 
    $descriptorspec = array(
     array('pipe', 'r'), 
     array('pipe', 'w'), 
     array('pipe', 'w') 
    ); 
    $pipes = array(); 
    $process = proc_open($cmd, $descriptorspec, $pipes); 
    fwrite($pipes[0], 'password\r'); 
    fclose($pipes[0]); 
    $string = array(stream_get_contents($pipes[1]), stream_get_contents($pipes[2])); 
    proc_close($process); 
    echo exec('whoami') . "\n"; 
    print_r($string); 

我從PHP得到這樣的響應:

 
www-data 
Array 
(
    [0] => 
    [1] => su: must be run from a terminal 

) 

這是顯然我想改變活躍的用戶,但有沒有辦法從PHP做到這一點?

+0

,要麼使用'sudo'或設置'粘bit':

試試這個代碼(用你的密碼更換密碼)。但是在腳本上要小心,因爲它們可能會被打斷,並且仍然有底層的解釋器/ shell +環境+環境變量。 – DanFromGermany

+1

您不能更改當前進程的活動用戶,只能在_new_進程中切換到其他用戶。如果你用bash命令,你可以看到它實際上用'ps f'做了什麼:它是一個全新的shell。同樣,你不能改變php運行的過程,但是你可以啓動一個子進程(儘管我通常會在web服務器中避免這種情況)。根據您對其他用戶的需求,像suphp這樣的軟件包或者使用SuExec可能是解決您的問題的解決方案。另一個選擇是使用正確的用戶運行deamon like gearmand,它遵從www數據的請求。 – Wrikken

回答

1

su命令只會更改當前用戶,而它正在執行的bash shell仍在運行。即使您要執行$ cmd = 'bash -c「sudo su testuser」'(將按預期執行),您只會更改當前用戶,直到執行proc_close,所以exec('whoami')將始終給你最初發布你的PHP腳本的用戶的用戶名。但是,您可以使用粗體命令來執行一個bash shell,它將以testuser身份執行,然後將命令傳遞給它。例如,如果你管'whoami'而不是'nirvana3105 \ r'whoami應該返回'testuser'。希望有所幫助。如果你想運行特定的命令或腳本

<?php 
    $cmd = "sudo -S su testuser"; 

    echo $cmd; 

    $desc = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w')); 
    $pipes = array(); 

    $process = proc_open($cmd, $desc, $pipes); 
    fwrite($pipes[0], "password\n"); 
    fwrite($pipes[0], "whoami"); 
    fclose($pipes[0]); 
    $string = array(stream_get_contents($pipes[1]), stream_get_contents($pipes[2])); 
proc_close($process); 

    print_r($string); 
?> 
+0

沒有工作。同樣的結果。 –

+0

當我從終端運行它時,此代碼起作用。因爲在你的上面的問題whoami返回www數據我假設你通過Apache運行它?如果是這樣,你需要使用「sudo adduser www-data sudo」將www-data添加到sudo組中。但是請注意,這可能不被推薦,因爲你不希望apache web用戶擁有這種權限。如果這隻適用於本地Intranet站點或者其他類似的應用,那麼它應該沒問題,否則這會給您的系統帶來一點安全威脅。 – elitechief21

+0

它的工作原理,謝謝。 –