Użytkownik Apache www-data
musi mieć uprawnienia do wykonywania niektórych aplikacji przy użyciu sudo
.
- Uruchom polecenie
sudo visudo
. W rzeczywistości chcemy edytować plik w. etc/sudoers
Aby to zrobić, używając sudo visudo
terminala, powiela sudoers
plik (temp) do edycji.
- Na końcu pliku dodaj następujący przykład: -Jeśli chcemy użyć polecenia do
restart
zadymienia i php
polecenia innej akcji w pytaniu,
www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php
(Zakłada się, że chcesz uruchamiać restart
i wykonywać php
polecenia przy użyciu uprawnień superużytkownika (root). Używasz php
polecenia 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 ALL
poleceń, bardzo niebezpieczne.
www-data ALL=NOPASSWD: ALL
3. Po edycji pliku sudoers ( visudo
edytujemy plik tymczasowy, sudoers
więc zapisz i zamknij plik tymczasowy (visudo), aby zapisać w sudoers
pliku. ( wq!
)
4.Oto, użyj teraz exec()
lub shell_exec
w następujący sposób w xxx.php
skrypcie. pamiętaj, aby użyć sudo
przed 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
Takitha Sumanadasa
źródło
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
źródło
/var/log/httpd/error*
.Zazwyczaj chcą podać pełne ścieżki do aplikacji, takich jak
whoami
,ls
iphp
. Jeśli nie masz pewności, jaka jest lokalizacja programu (pełna ścieżka), możesz dowiedzieć się:Następnie określ to w skrypcie.
źródło
echo shell_exec("/usr/bin/php somefile.php 2>&1")
:?hu
. Więc trzeba się upewnić, że skryptphp
jest próbą uruchomienia jest ustawiony tak:chmod 755 somescript.php
. Pozwoli to użytkownikowi, na którym działa Apache, na wykonanie i odczytanie.php
pliku.Czy twój php.ini ogranicza dostępny zestaw poleceń?
To jest ode mnie
/etc/php5/php.ini
źródło
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
yourname
użytkownika, a php jest uruchamiany zwww-data
. Pierwszym pomysłem jest otwarcie terminala przedwww-data
użytkownikiem i wypróbowanie tego samego polecenia. Więc..../etc/passwd
plik, znajdź linię zwww-data
użytkownikiem i zmień jego powłokę logowania (ostatnią) z/bin/false
(lub cokolwiek) na/bin/bash
.www-data
Terminal otwarty :su www-data
/etc/passwd
pliku, gdy skończyszPHP 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łączdisplay_errors
i wszystkie inne flagi, aby zobaczyć błędy w przeglądarce. Mogą je czytać i debugować.Uzyskaj
www-data
powłokę (patrz pierwsza sekcja) i wykonaj coś w styluecho '<?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.
źródło
Dla mnie najprostszym sposobem było wejście do php.ini i skomentowanie linii, która zaczyna się od
źródło