uprawnienie php shell_exec () w systemie Linux Ubuntu


13

Zajmuję się tworzeniem aplikacji php za pomocą serwera Linux. Mój problem polega shell_exec()na tym, że wywołanie jakiegoś pliku exe nie działa (właściwie nie exe, to rodzaj pliku wykonywalnego linux)

echo shell_exec("whoami");

Mam demona

echo shell_exec("ls")

Mam nazwę pliku, ale

echo shell_exec("php -v")

Nic nie mam, pusta strona

echo shell_exec("php ....bla bla bla")

pusta strona też.

Wszystkie te polecenia, jeśli piszę na terminalu (użytkownik hu), będą działać. Szukałem google przez kilka godzin, ludzie mówią, że z powodu pozwolenia. Nie mam doświadczenia w systemie Linux. Co muszę zrobić, aby uruchomić mój program w php?

Odpowiedzi:


10

Użytkownik Apache www-datamusi mieć uprawnienia do wykonywania niektórych aplikacji przy użyciu sudo.

  1. Uruchom polecenie sudo visudo. W rzeczywistości chcemy edytować plik w. etc/sudoersAby to zrobić, używając sudo visudoterminala, powiela sudoersplik (temp) do edycji.
  2. Na końcu pliku dodaj następujący przykład: -Jeśli chcemy użyć polecenia do restartzadymienia i phppolecenia innej akcji w pytaniu,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php

(Zakłada się, że chcesz uruchamiać restarti wykonywać phppolecenia przy użyciu uprawnień superużytkownika (root). Używasz phppolecenia na usr/bin/ścieżce)

Jeśli jednak chcesz uruchamiać każdą aplikację przy użyciu uprawnień superużytkownika, dodaj następujące elementy zamiast powyższych. Nie możesz tego robić, nie dla ALLpoleceń, bardzo niebezpieczne.

www-data ALL=NOPASSWD: ALL

3. Po edycji pliku sudoers ( visudoedytujemy plik tymczasowy, sudoerswięc zapisz i zamknij plik tymczasowy (visudo), aby zapisać w sudoerspliku. ( wq!)

4.Oto, użyj teraz exec()lub shell_execw następujący sposób w xxx.phpskrypcie. pamiętaj, aby użyć sudoprzed użyciem polecenia w skrypcie php.

dawny:-

exec ("sudo /etc/init.d/smokeping restart 2>&1");

lub

shell_exec("sudo php -v"); 

Tak więc w swoim problemie dodaj polecenia, których chcesz używać step no (2.), dodając i zmieniając skrypt php, jak chcesz.

tutaj jest ten sam problem, co twój /programming//a/22953339/1862107


To pytanie nie dotyczy używania sudo.
tricasse

To tak źle sformułowane
Barney Chambers

5

Spróbuj podać całą ścieżkę do pliku binarnego php. Np. /usr/bin/php

Jeśli go nie znasz, znajdź go za pomocą: which php


echo shell_exec ("/ usr / bin / php -v"); nie działa
ngoaho91

kiedy mówisz „nie działa”, co dostajesz? Czyli jakieś błędy? Coś w dziennikach błędów php / apache? Jeśli strona jest pusta, zobacz źródło daje ci coś do pracy? Niestety termin „nie działa” nie daje nam nic do pracy ...
Keiran Holloway

@ ngoaho91 - zazwyczaj są to dzienniki /var/log/httpd/error*.
slm

: D Mam pustą stronę, nic do zobaczenia. gdzie jest plik dziennika błędów php / apache?
ngoaho91

@ ngoaho91 - co to jest dystrybucja Linuksa? CentOS, Ubuntu?
slm

4

Zazwyczaj chcą podać pełne ścieżki do aplikacji, takich jak whoami, lsi php. Jeśli nie masz pewności, jaka jest lokalizacja programu (pełna ścieżka), możesz dowiedzieć się:

$ type php
php is /usr/bin/php

Następnie określ to w skrypcie.

<?php
    echo shell_exec("/usr/bin/php ....bla bla bla");
?>

uruchamiam twoje polecenie. wpisz php => php to / usr / bin / php. ale polecenie pełnej ścieżki nadal zwraca mi pustą stronę.
ngoaho91

Co jeśli to zrobisz echo shell_exec("/usr/bin/php somefile.php 2>&1"):?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: błąd relokacji: / usr / bin / php: symbol X509_free, wersja OPENSSL_1.0.0 nie zdefiniowana w pliku libcrypto. so.1.0.0 z odniesieniem do czasu łącza
ngoaho91

OK, serwer WWW (Apache) zazwyczaj działa jako inny użytkownik, a nie hu. Więc trzeba się upewnić, że skrypt phpjest próbą uruchomienia jest ustawiony tak: chmod 755 somescript.php. Pozwoli to użytkownikowi, na którym działa Apache, na wykonanie i odczytanie .phppliku.
slm

1
@ ngoaho91 - teraz wszystko powinno być w porządku, ten błąd mówi mi, że coś jest nie tak z konfiguracją Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
slm

2

Czy twój php.ini ogranicza dostępny zestaw poleceń?

To jest ode mnie /etc/php5/php.ini

; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =

nie, moje ini takie same jak twoje
ngoaho91

2

Jak debugować problemy z shell_exec

OK, tutaj mamy problem: coś działa w terminalu i nie działa w shell_exec php (lub exec, spawn, cokolwiek). Pomyślmy: jaka jest różnica między Tobą a php? Oto trzy:

PHP jest wykonywane na podstawie reguł serwera HTTP

Rzeczywiście, Twój terminal działa od yournameużytkownika, a php jest uruchamiany z www-data. Pierwszym pomysłem jest otwarcie terminala przed www-dataużytkownikiem i wypróbowanie tego samego polecenia. Więc....

  • Otwórz /etc/passwdplik, znajdź linię z www-dataużytkownikiem i zmień jego powłokę logowania (ostatnią) z /bin/false(lub cokolwiek) na /bin/bash.
  • www-dataTerminal otwarty :su www-data
  • Spróbuj php -v lub cokolwiek, czego nie możesz wykonać z php. Jeśli to nie zadziała - zobaczysz ładne logi i będziesz mógł debugować problem.
  • Nie zapomnij naprawić /etc/passwdpliku, gdy skończysz

PHP jest wykonywane z PHP .

PHP jest paranoicznym enogh i istnieje wiele opcji w konfiguracji apache / nginx i php.ini, które mogą przerwać twoją próbę.

Jest to nieco bardziej skomplikowane do debugowania. Istnieją tutaj dwie opcje:

  • Włącz dzienniki w przeglądarce i zobacz problem. Edytuj swoje php.ini, włącz display_errorsi wszystkie inne flagi, aby zobaczyć błędy w przeglądarce. Mogą je czytać i debugować.

  • Uzyskaj www-datapowłokę (patrz pierwsza sekcja) i wykonaj coś w stylu

echo '<?php shell_exec("php -v"); ?>' | php

który wykona ten sam kod php w konsoli i będziesz mógł zobaczyć błędy i debugować.

PHP jest uruchamiane z SELinux / apparmor

Selinux i apparmor to rzeczy bezpieczeństwa, które zabraniają aplikacjom wykonywania określonych działań (na przykład odradzania innych aplikacji lub niektórych innych aplikacji). Może jest włączony na Twoim serwerze.

Aby sprawdzić - wyłącz selinux / apparmor i sprawdź, czy problem występuje.

Aby to naprawić - przeczytaj odpowiednią instrukcję i popraw reguły zapisu dozwolone dla twojej sprawy.


0

Dla mnie najprostszym sposobem było wejście do php.ini i skomentowanie linii, która zaczyna się od

disable_functions
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.