it-swarm.com.de

PHP exec () führt bei der Ausführung über einen Browser keinen Shell-Befehl aus

Ich habe ein bestimmtes PHP -Skript, das exec () aufruft, um einen Befehl zum Konvertieren eines PDF in JPG auszuführen. Dieser Befehl funktioniert gut in Bash.

Beachten Sie Folgendes, um Ihre ersten Fehler bei der Fehlerbehebung zu vermeiden:

  • safe_mode = Aus
  • Die Berechtigung für das Verzeichnis, in dem sich das PDF befindet, und das Skript ist auf 777 gesetzt. In diesem Verzeichnis wird auch die JPG geschrieben.
  • Der Befehl, den ich an exec () übergebe, verweist explizit auf die verwendete Binärdatei (z. B./usr/local/bin/convert).
  • display_errors = Ein
  • error_reporting = E_ALL
  • disable_functions = [leer]
  • Ich erkläre die Ausgabe von exec () und gibt nichts zurück. Der Befehl, der standardmäßig ausgeführt wird, gibt nichts zurück.

Wenn ich dieses PHP -Skript vom Browser aus aufrufe (besuche http://www.example.com/script.php ), führt exec () sein Argument nicht aus.

IMPORTANT: Ich weiß, dass es keine Probleme mit meinem Skript oder der Art und Weise gibt, wie ich den bash-Befehl erstellt habe, denn von bash aus kann ich das Skript mit 'php' ausführen und es funktioniert (zB 'php script. PHP konvertiert die Datei)

Ich habe auch versucht, exec () mit system () auszuschalten.

Zuletzt hatte ich dieses Problem schon einmal in der Vergangenheit, kann mich aber nicht erinnern, wie ich es behoben habe.

Ich weiß, dass etwas fehlt, was ich vermisse, also hoffe ich, dass jemand anderes dies erlebt hat und ich erinnere mich, wie ich es reparieren kann!

Vielen Dank im Voraus für jegliche Unterstützung, die Sie leisten können.

Alex

32
Alex

Fügen Sie am Ende Ihres Befehls 2>&1 hinzu, um Fehler von stderr nach stdout umzuleiten. Dies sollte deutlich machen, was schief läuft.

68
Greg

Nur eine Vermutung, es könnte sein, dass Ihr Webserver-Prozessbenutzer keine Berechtigungen dafür hat.

6
TomHastjarjanto

Da es funktioniert, wenn von der Befehlszeile aus (die sich unter Ihrem eigenen Benutzerkonto befindet), klingt es für mich wie das Konto, unter dem der Webserver ausgeführt wird (häufig "www-data"), keine Ausführungsberechtigung für das Konvertierungsprogramm hat .

5
Chad Birch

Haben Sie über Dateiberechtigungen nachgedacht? Im Browser wird PHP unter einem Benutzer ausgeführt. Wenn Sie es jedoch in Bash ausführen, wird es wahrscheinlich mit Ihren Benutzerberechtigungen ausgeführt.

Es ist das erste, was ich überprüfen würde.

Amy

3
Amy Anuszewski

Verfügt Ihr Apache/Webserver-Benutzer über die erforderlichen Rechte, um den Shell-Befehl auszuführen? 

Wenn Sie vom Cl aus starten, werden Sie wahrscheinlich als anderer Benutzer ausgeführt, was möglicherweise erklärt, welcher Cl funktioniert, aber über den Browser nicht.

2
ConroyP

Dem Apache-Benutzer www-data müssen Berechtigungen zum Ausführen bestimmter Anwendungen mit Sudo erteilt werden.

  1. Führen Sie den Befehl Sudo visudo aus. Eigentlich möchten wir die Datei in etc/sudoers bearbeiten. Um dies zu tun, verwenden Sie Sudo visudo im Terminal und duplizieren (temp) sudoers die zu bearbeitende Datei. 
  2. Fügen Sie am Ende der Datei das folgende ex hinzu: -if wir möchten den Befehl für den Neustart von smokeping und den Mount-Befehl für eine andere Aktion verwenden.

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

(Dies setzt voraus, dass Sie die Befehle restart und mount mit Superuser-Berechtigungen (.). (Root) ausführen möchten.)

Wenn Sie jedoch jede Anwendung mit den Superuser-Privilegien .__ ausführen möchten, fügen Sie Folgendes anstelle des oben genannten hinzu. Möglicherweise möchten Sie dies nicht tun, nicht für ALL-Befehle. Dies ist sehr gefährlich.

www-data ALL=NOPASSWD: ALL

3 .Nachdem Sie die Sudoers-Datei bearbeitet haben (durch visudo bearbeiten wir die temporäre Datei von sudoers. Speichern und beenden Sie die temporäre Datei (visudo), um sie in sudoers-Datei zu schreiben. (wq!)

4. Das ist es nun, verwenden Sie exec() auf folgende Weise in Ihrem xxx.phpscript .Denken Sie daran, Sudo zu verwenden, bevor Sie den Befehl im PHP-Skript verwenden.

ex:-

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

Fügen Sie also in Ihrem Problem die Befehle, die Sie verwenden möchten, zu step no (2.) hinzu, während Sie Ihr PHP-Skript hinzufügen und als das, was Sie möchten, ändern. 

1

Es kann daran liegen, dass die verschiedenen Benutzer das Skript über den Webserver und das Skript über die Bash ausführen.

Normalerweise haben die Skripts/exec wie beim Benutzer 'www' über den Server aufgerufen, und dieser Benutzer hat keinen Schreibzugriff auf Ihre Region. Wenn Sie das Skript jedoch in Bash ausführen, verfügen Sie über Schreibberechtigungen.

1
user235044

Ich habe festgestellt, dass dies ein Problem mit ImageMagick ist, nicht mit PHP. Ich versuche ein paar Korrekturen, und wenn sie nicht funktionieren, werde ich am Ende eine gemeinsame PHP - Bibliothek (wahrscheinlich imagick) verwenden, um die Arbeit zu erledigen.

0
Alex

Standardausgabegerät wird geändert.

login als www (nach dem Aktivieren) gibt die Ausgabe über Shell aus, jedoch nicht über PHP.

0
Rudger