PHP Shell_exec () Berechtigung unter Linux Ubuntu


13

Ich entwickle eine PHP-Anwendung mit Linux-Server. Mein Problem ist das Ausführen shell_exec()einer Exe-Datei, die nicht funktioniert (eigentlich ist es keine Exe-Datei, sondern eine Art ausführbare Linux-Datei)

echo shell_exec("whoami");

Ich habe einen Daemon

echo shell_exec("ls")

Ich habe aber einen Dateinamen

echo shell_exec("php -v")

Ich habe nichts, eine leere Seite

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

eine leere Seite auch.

Alle diese Befehle funktionieren, wenn ich sie auf dem Terminal (Benutzer hu) eingebe. Ich habe Google seit mehreren Stunden durchsucht, die Leute sagen, dass wegen der Erlaubnis. Ich habe keine Erfahrung mit Linux. Was muss ich tun, um mein Programm in PHP auszuführen?

Antworten:


10

Dem Apache-Benutzer www-datamüssen Berechtigungen erteilt werden, um bestimmte Anwendungen mit auszuführen sudo.

  1. Führen Sie den Befehl aus sudo visudo. Eigentlich wollen wir die Datei in bearbeiten. etc/sudoersUm dies zu tun, verwenden Sie sudo visudoin Terminal, es duplizieren (temporäre) sudoersDatei zu bearbeiten.
  2. Fügen Sie am Ende der Datei Folgendes hinzu: -wenn Sie den Befehl zum restartRauchen und den phpBefehl für eine andere Aktion in Ihrer Frage verwenden möchten ,

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

(Dies setzt voraus, dass Sie ausführen restartund phpBefehle mit Superuser-Rechten (root) ausführen möchten. Und Sie verwenden den phpBefehl im usr/bin/Pfad.)

Wenn Sie jedoch jede Anwendung mit Superuser-Rechten ausführen möchten, fügen Sie Folgendes anstelle der oben genannten hinzu. Möglicherweise möchten Sie dies nicht tun, nicht für ALLBefehle, die sehr gefährlich sind.

www-data ALL=NOPASSWD: ALL

3. Nachdem Sie die sudoers-Datei bearbeitet haben (indem Sie die temporäre Datei visudobearbeiten) sudoers, speichern Sie sie und beenden Sie die temporäre Datei (visudo), um sie in die sudoersDatei zu schreiben . ( wq!)

4.Das ist es, benutze jetzt exec()oder shell_execauf die folgende Art und Weise in deinem xxx.phpSkript. Denken Sie daran, sudoden Befehl vor der Verwendung im PHP-Skript zu verwenden.

Ex:-

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

oder

shell_exec("sudo php -v"); 

Fügen Sie also in Ihrem Problem die Befehle hinzu, die Sie beim Hinzufügen verwenden möchten, step no (2.)und ändern Sie Ihr PHP-Skript nach Ihren Wünschen .

Hier ist das gleiche Problem wie bei Ihnen /programming//a/22953339/1862107


Bei dieser Frage geht es nicht um die Verwendung von sudo.
Tricasse

Dies ist so schlecht formuliert
Barney Chambers

5

Versuchen Sie, den gesamten Pfad zur PHP-Binärdatei anzugeben. /usr/bin/php

Wenn Sie es nicht kennen, suchen Sie es mit: which php


echo shell_exec ("/ usr / bin / php -v"); funktioniert nicht
Ngoaho91

wenn du sagst "funktioniert nicht" was bekommst du? Dh irgendwelche Fehler? Irgendetwas in Ihren PHP / Apache-Fehlerprotokollen? Wenn die Seite leer ist, können Sie mit der Quelltextansicht arbeiten? Leider gibt der Begriff "funktioniert nicht" uns nichts zu arbeiten ...
Keiran Holloway

@ ngoaho91 - in der Regel sind die Protokolle /var/log/httpd/error*.
SLM

: D Ich habe eine leere Seite, nichts zu sehen. Wo ist die PHP / Apache-Fehlerprotokolldatei?
Ngoaho91

@ ngoaho91 - welche Linux-Distribution ist das? CentOS, Ubuntu?
SLM

4

Sie wollen in der Regel vollständige Pfade zu Anwendungen wie spezifizieren whoami, lsund php. Wenn Sie sich nicht sicher sind, wo sich ein Programm befindet (vollständiger Pfad), können Sie Folgendes herausfinden:

$ type php
php is /usr/bin/php

Dann geben Sie es so in Ihrem Skript an.

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

Ich führe deinen Befehl aus. typ php => php ist / usr / bin / php. Aber der Befehl für den vollständigen Pfad gibt mir immer noch eine leere Seite zurück.
Ngoaho91

Was ist, wenn Sie dies tun echo shell_exec("/usr/bin/php somefile.php 2>&1")?
slm

echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: Verschiebungsfehler: / usr / bin / php: Symbol X509_free, Version OPENSSL_1.0.0 nicht in der Datei libcrypto definiert. so.1.0.0 mit Link Zeitreferenz
ngoaho91

OK, der Webserver (Apache) wird normalerweise als ein anderer Benutzer ausgeführt, nicht hu. So müssen Sie sicherstellen , dass das Skript phpzu laufen versucht , wird wie folgt festgelegt: chmod 755 somescript.php. Auf diese Weise kann der Benutzer, unter dem Apache ausgeführt wird, Ihre .phpDatei ausführen und lesen .
SLM

1
@ ngoaho91 - jetzt sollte alles in Ordnung sein. Dieser Fehler sagt mir, dass etwas mit Ihrem Apache / PHP-Setup nicht stimmt. freetutorialssubmit.com/php-relocation-error/2221
slm

2

Beschränkt Ihre php.ini den verfügbaren Befehlssatz?

Das ist von meinem /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 =

nein, mein ini ist dasselbe wie deins
ngoaho91

1

So debuggen Sie Probleme mit shell_exec

OK, hier haben wir ein Problem: Einige Dinge funktionieren im Terminal und nicht in PHP's Shell_Exec (oder exec, spawn, was auch immer). Lassen Sie uns überlegen: Was ist der Unterschied zwischen Ihnen und PHP? Hier sind drei:

PHP wird von HTTP-Server-Regeln ausgeführt

In der Tat läuft Ihr Terminal vom yournameBenutzer und PHP wird von ausgeführt www-data. Die erste Idee ist also, das Terminal vom www-dataBenutzer aus zu öffnen und den gleichen Befehl auszuführen. So....

  • Öffnen Sie die /etc/passwdDatei, suchen Sie die Zeile mit dem www-dataBenutzer und ändern Sie die Login-Shell (letzte) von /bin/false(oder was auch immer) in /bin/bash.
  • Open www-data's Terminal:su www-data
  • Versuchen Sie PHP-V oder was auch immer Sie können nicht aus PHP ausführen. Wenn es nicht funktioniert, sehen Sie nette Protokolle und können das Problem beheben.
  • Vergessen Sie nicht, die /etc/passwdDatei wiederherzustellen, wenn Sie fertig sind

PHP wird von PHP ausgeführt .

PHP ist paranoid und es gibt viele Optionen in der Konfiguration von Apache / Nginx und php.ini, die Ihren Versuch unterbrechen können.

Das Debuggen ist etwas komplizierter. Hier gibt es zwei Möglichkeiten:

  • Aktivieren Sie die Protokolle im Browser und sehen Sie das Problem. Bearbeiten Sie Ihre php.ini, aktivieren Sie display_errorsund alle anderen Flags, um Fehler im Browser anzuzeigen. Sie können sie lesen und debuggen.

  • Besorgen Sie sich www-datadie Shell (siehe ersten Abschnitt) und führen Sie so etwas aus

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

Dies führt denselben PHP-Code in der Konsole aus und Sie können Fehler und Fehlerbehebungen sehen.

PHP wird von SELinux / apparmor ausgeführt

Selinux und Apparmor sind Sicherheitselemente, die es Anwendungen verbieten, bestimmte Aktionen auszuführen (z. B. das Starten anderer Anwendungen oder bestimmter anderer Anwendungen). Möglicherweise ist es auf Ihrem Server aktiviert.

Zum Überprüfen - deaktivieren Sie selinux / apparmor und prüfen Sie, ob ein Problem vorliegt.

Zum Korrigieren - lesen Sie das entsprechende Handbuch und korrigieren Sie die zulässigen Schreibregeln für Ihren Fall.


0

Für mich war der einfachste Weg, in die php.ini zu gehen und die Zeile zu kommentieren, die mit beginnt

disable_functions
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.