PHP exec() funktioniert nicht richtig
Ich habe Schwierigkeiten mit der PHP exec() Funktion. Es scheint nicht aufrufen bestimmter Funktionen. Zum Beispiel, der code echo exec('ls');
erzeugt keine Ausgabe überhaupt (es sollte, gibt es Dateien im Verzeichnis). Haupt-Grund dafür ist ein problem für mich ist, dass ich versuche ausführen .jar aus einem PHP-exec () - Aufruf.
Soweit ich weiß, ich bin Aufruf des java-Programms richtig, aber ich bekomme keine der Ausgabe. Die .jar ausgeführt werden können von der Kommandozeile auf dem server. (Für das Protokoll, es ist ein apache-server).
Meine php für den .jar ausführen sieht so aus:
$output = array();
exec('java -jar testJava.jar', $output);
print_r($output);
Alles, was ich bekommen für die Ausgabe aus dieser exec () - Aufruf ist Array()
.
Ich habe Erfolg mit exec() ausführen 'whoami'
und 'pwd'
. Ich kann nicht herausfinden, warum einige Funktionen arbeiten und einige sind nicht. Ich bin nicht die erfahrenste person mit PHP entweder, so bin ich mir auch nicht sicher, wie Sie das Problem zu diagnostizieren. Jegliche Hilfe würde geschätzt werden.
- Was ist der genaue Fehler? Und auch, möchten Sie vielleicht so etwas wie dieses:
new BufferedWriter(new FileWriter(new File("out.txt")));
- Der Fehler ist eigentlich eine FileNotFoundException für out.txt . Mein Verständnis ist, dass die Datei nicht erstellt wird, ist also, warum es nicht gefunden wird.
- Möglicherweise müssen Sie auch ändern Sie die Berechtigungen des Verzeichnisses, in das Glas zu schreiben versucht die Datei zu. Nicht nur die Berechtigungen der jar-Datei selbst.
- Ja, wie es scheint. Sie könnten auch versuchen, wickeln Sie es um mit einer Datei.
- Hey, das funktioniert jetzt .jar ausgeführt von der Kommandozeile kein problem. Ich werde versuchen, es in PHP jetzt und aktualisieren Sie meine Frage.
- Haben Sie das problem gelöst? Ich bin daran interessiert, wo Sie eigentlich falsch gelaufen ist.
- Habe ich nicht. Ich habe weiterhin meine Suche im internet, aber ich habe nicht gefunden was. Es ist ziemlich frustrierend, vor allem, weil ich gefunden habe, eine Reihe von Beispielen, wo Leute scheinen zu haben der gleiche code, die ich tun, außer dass es für Sie funktioniert.
- Haben Sie erfolgreich verengt Sie sich überhaupt? Ist die jar-Datei, die definitiv nicht laufen? Ist PHP nicht richtig abfangen die Ausgabe des Programms? Wenn die jar-Datei wird nicht ausgeführt, ich würde auf jeden Fall vermuten, es zu sein, Berechtigungen Fehler irgendwo. Ich definitiv nicht glaube, dein problem ist etwas klar. Sie sollten denken, außerhalb der box ein wenig; vielleicht versuchen Sie geben den vollständigen Pfad zu der jar-Datei? Vielleicht aktualisieren Sie Ihren Beitrag mit ein bisschen mehr code und beschreiben, was Sie versucht haben, geben Sie, oder einer von uns, ein eureka moment.
- Ich denke, dass, weil die out.txt Datei, die nicht zeigen, bis überhaupt PHP ist definitiv nicht Aufruf der .jar an alle, anstatt einfach nicht abfangen der Ausgabe. Wahrheit werden gesagt, ich bin nicht alle, die Erfahrung mit PHP/Appache-Server, also bin ich mit Mühe den kommenden up mit Möglichkeiten, um zu versuchen und zu diagnostizieren das Problem. In Bezug auf herauszufinden, was hier passiert, ich weiß wirklich nicht einmal wissen, wo zu beginnen.
- Ich muss Fragen; Sie nahm ikjoel Vorschlag der änderung der BufferedWriter-Zeile zu
new BufferedWriter(new FileWriter(new File("out.txt")));
Recht? weil sonst java würde das nicht schaffen out.txt Datei. Vielleicht sollte man auch ein System haben.aus.println("Hallo!"); in Ihrer jar-Datei, so dass der Ausgang wäre möglicherweise geschrieben$output
array beim ausführen von php. Der code, den Sie geschrieben sein sollte zu arbeiten - oder zumindest das ausführen der jar-Datei, die - abgesehen von einem Fehler nichts mit dem code selbst. Keep that in mind! Pfade, Berechtigungen, etc.! - Ich habe nicht den code gerne. Ich werde zu aktualisieren, die ursprüngliche Frage mit dem neuen testJava code, obwohl es nicht wirklich anders. Es hat einen BufferedWriter, und ein einfaches System.aus.println-Zeile. Soweit Berechtigungen, testJava.jar Universelle lese - /Programm-Zugriff und der apache seinen Besitzer. Ich habe nicht den vollständigen Pfad, weil ich nicht denke, PHP ist der Aufruf der "java" - Befehl an alle - ich habe versucht
exec('java -jar x')
, um zu sehen, ob ich bekommen würde, die entsprechende Fehlermeldung, aber ich habe nichts, also wie ich sagte, ich bin mir ziemlich sicher, dass es nur nicht aufrufen java richtig. - Wild guess:
java
ist nicht in Ihrem Pfad.... - Nein, es ist - das Problem war SELinux, es war die Blockierung von PHP aus aufrufen von java.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum Sie nicht in der Lage zu führen Sie ls ist aufgrund der Berechtigungen.
Wenn Sie den web-server als Benutzer Eine , dann können Sie nur ls nur diejenigen Verzeichnisse, die Berechtigungen für Benutzer Eine.
Können Sie entweder ändern Sie die Berechtigungen des Verzeichnisses, oder Sie können den Benutzer ändern, unter dem der server ausgeführt wird durch ändern der httpd.conf - Datei(ich gehe davon aus, dass Sie apache benutzen).
Wenn Sie ändern die Berechtigungen für das Verzeichnis haben, dann stellen Sie sicher, dass Sie ändern die Berechtigungen von übergeordneten Verzeichnissen auch.
Ändern der web-server-Benutzer, Folgen Sie folgenden Schritten:
Öffnen Sie die folgende Datei:
Suche nach
Ändern Sie die Benutzer-und Gruppennamen. Nach der änderung der Benutzer-und Gruppen-starten Sie den server mit folgenden Befehl.
Dann werden Sie in der Lage sein, um alle Befehle ausführen, die ausgeführt werden können, die von diesem Benutzer.
EDIT:
'User' sollte ein nicht-root-Benutzer in httpd.conf. Apache standardmäßig doesnot dienen Seiten, wenn es als root ausgeführt. Sie müssen Benutzer nicht als root-Benutzer oder sonst bekommst du Fehler.
Wenn Sie erzwingen möchten, dass der apache als root laufen, dann musst du eine Umgebungsvariable wie folgt:
Dann müssen Sie neu erstellen apache, bevor Sie es als root ausführen.
Habe ich eine Lösung:
Befehl wird an der Konsole, aber nicht von php via exec/system/passthru.
Das Problem ist der Pfad zum Befehl. Es funktioniert mit dem absoluten Pfad zum Befehl
So, dass:
wird:
Und nun, es funktioniert von php über exec
Der Where-Befehl binary können Sie sehen, über
whereis wkhtmltopdf
Habe ich das Problem entdeckt - SELinux blockiert wurde PHP den Zugriff auf bestimmte Funktionen. Setzen Sie SELinux in den permissive-Modus wurde behoben, der Probleme (obwohl, ich würde lieber nicht verlassen, um SELinux in den permissive-Modus zu versetzen; ich würde lieber einen Weg finden, dass bestimmte Funktionen, wenn ich kann).
Riss mir die Haare aus versucht, herauszufinden, warum PHP exec funktioniert von der Kommandozeile aus, aber nicht von Apache. Am Ende fand ich die folgenden Berechtigungen:
VERWENDEN: setsebool -P httpd_ssi_exec 1
FINDEN Sie unter: https://linux.die.net/man/8/httpd_selinux
Dein problem ist nicht eine Hinrichtung, aber die syntax der exec-Befehl. Das zweite argument wird immer als array zurückgegeben und enthält eine einzelne Zeile der Ausgabe, die in jeder index. Der Rückgabewert der exec-Funktion enthält die Letzte Zeile die Befehle ausgegeben. Um die Ausgabe, die Sie verwenden können:
foreach($Ausgabe as $line) echo "$line\n";
Sehen http://php.net/manual/en/function.exec.php für details. Sie können auch den Befehl exit-Wert mit einem Dritten argument.