2011-07-13 17 views
8

Chciałbym utworzyć skrypt php, aby wykonać polecenie powłoki i zwrócić jego wynik. Serwer wymaga klucza prywatnego. Kiedy po raz pierwszy zdecydowałem się przetestować to, stworzyłem to:Jak wykonać polecenie powłoki ze skryptu php?

<?php 
$command = "ls"; 
$output = shell_exec($command); 
echo "<pre>$output</pre>"; 
?> 

To działało dobrze. Ale kiedy zmienił $command do polecenia naprawdę chciałem uruchomić:

$command = "/etc/init.d/mycontrollerd status /etc/mycontrollerconfig"; 

dał mi ten wynik:

You need root privileges to run this script 

Domyślam się, że trzeba użyć sudo. Oczywiście będzie to wymagało umieszczenia pliku PEM gdzieś na serwerze. Zakładając, że to zrobię, czym dokładnie powinien być $command? Czy powinienem używać shell_exec(), exec(), system() lub czegoś innego?

Odpowiedz

4

Nie ma znaczenia, która funkcja php użyć, aby uruchomić skrypt - czego brakuje to zezwolenie na koncie użytkownika.

Albo użyj sudo (prekonfiguruj użytkownika serwera sieciowego, aby uruchomić dokładnie polecenie bez hasła poprzez visudo i przedrostek polecenia z sudo) lub skonfiguruj skrypt setuid, który wykonuje polecenie na sobie.

+0

Chociaż * także * ma znaczenie, że konto użytkownika musi być autoryzowane, nie oznacza to, że nie ma najlepszego wyboru dla funkcji PHP. Który jest najlepszy? –

+0

@Kenneth Vogt 'exec', ponieważ nie wiąże się niepotrzebnie z powłoką i zwraca wynik, lub' passthru', który bezpośrednio wyprowadza wynik, ale wymagałby modyfikacji oryginalnego kodu. – phihag

3

To, co naprawdę musisz zrobić, to ustawić serwer internetowy tak, aby działał jako konkretny użytkownik (inny niż "nobody" na przykład), lub dać temu użytkownikowi uprawnienia do tego, co chcesz wykonać.

Zobacz także: PHP shell_exec() and sudo: must be setuid root

+0

To nasuwa pytanie: Jak "ustawić serwer internetowy tak, aby działał jako inny użytkownik niż" nikt "? –

+0

@Kenneth Vogt, skąd mam wiedzieć, nie określiłeś serwera, z którego korzystałeś. Jeśli używasz Apache, sprawdź dyrektywy konfiguracyjne 'User' i' Group'. (http://httpd.apache.org/docs/1.3/mod/core.html#user) Jeśli nie możesz tego zrobić, właściwym miejscem do zapytania jest ServerFault.com. – Brad