Wie kann ich debug exec() Probleme?
Den exec-Befehl funktioniert nicht auf meinem server, es macht gar nichts, ich habe safe_mode off, und verifiziert, dass alle Konsolen-Befehle funktionierten, habe ich versucht, mit absoluten Pfaden. Ich habe die Berechtigungen für die Anwendungen und alle Anwendungen, die ich brauche haben die Ausführung Berechtigungen. Ich weiß nicht, was anderes zu tun, hier sind die überblick über die codes, die ich ausprobiert habe.
echo exec('/usr/bin/whoami');
echo exec('whoami');
exec('whoami 2>&1',$output,$return_val);
if($return_val !== 0) {
echo 'Error<br>';
print_r($output);
}
exec('/usr/bin/whoami 2>&1',$output,$return_val);
if($return_val !== 0) {
echo 'Error<br>';
print_r($output);
}
Den letzten zwei codes angezeigt:
Error
Array ( )
Habe mich an den server-Dienst, und Sie können mir nicht helfen, Sie nicht wissen, warum der exec-Befehl nicht funktioniert.
Was meinst du mit "funktioniert nicht" ? Irgendwelche Fehler ausgegeben ?
Hast du versucht den Fehler.log?
Fehler Einstellungen
Error log zeigt nicht alles, was über das Thema. Ich habe
Hast du versucht den Fehler.log?
Fehler Einstellungen
display_errors = 1
und error_report = E_ALL
? (Beachten Sie, dass Sie sollten nicht die Fehler anzuzeigen, die auf live-Systemen. Deaktivieren Sie es, wenn Sie fertig sind)Error log zeigt nicht alles, was über das Thema. Ich habe
display_errors
und error_reporting
aktiviert. Kann immer noch nichts finden, das problem.InformationsquelleAutor carcargi | 2012-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
haben Sie einen Blick auf
/etc/php.ini
gibt es unter:stellen Sie sicher, dass exec ist nicht aufgelistet so:
Wenn ja, entfernen Sie es und starten Sie den apache.
Für einfaches Debuggen, die ich in der Regel, wie führen Sie die php-Datei manuell (Können auf Anfrage mehr Fehler, ohne es in der Haupt-ini). zu tun, fügen Sie die Kopfzeile:
an den Anfang der Datei, geben Sie die Berechtigungen mittels
chmod +x myscript.php
und führen Sie es./myscript.php
. Es ist sehr achtsam insbesondere auf einem ausgelasteten server, die sehr viel schreiben in die log-Datei.BEARBEITEN
Klingt wie ein Berechtigungen Problem. Erstellen Sie ein bash-Skript, das etwas tut, einfach wie
echo "helo world"
und versuchen, Sie auszuführen. Stellen Sie sicher, dass die Berechtigungen für die Datei und für den Ordner, der die Datei enthält. Sie sollte einfach tunchmod 755
nur zum testen.disable_functions
ist leer in meinemphp.ini
ich das Skript ausführen, wie Sie vorgeschlagen und die Konsole nicht alles zeigen.Antwort aktualisiert.
Vielen Dank, das war der trick, das problem war, dass irgendwie (wie, mein client hat Zugriff auf den server und er denkt er ist ein Experte XD), er kopiert und verändert die Berechtigungen der apps. Ich habe Sie dazu bewegt zurück in den ursprünglichen Ordner und konfiguriert den Pfad wieder, jetzt funktioniert alles, ich fand das beim testen der Berechtigungen der Anwendung. Danke.
Glücklich zu helfen !
er verändert die Berechtigungen
whoami
??InformationsquelleAutor Kuf
Da Sie fallen aus dem PHP-Kontext in die native shell, sind Sie gehen zu müssen eine Menge Probleme zu Debuggen.
Die beste und sicherste, die ich in der Vergangenheit verwendet haben, ist das schreiben der Ausgabe des Scriptes in eine log-Datei und beschatten es, während der PHP-Ausführung.
Dann in einer separaten Schale:
Beim ausführen von PHP-Skript, Ihre Fehler und die Ausgabe aus der shell-Aufruf wird die Anzeige in Ihrem
debug.log
Datei.InformationsquelleAutor Mike Mackintosh
Können Sie abrufen der Ausgaben und return-code der exec Befehle, thoses vielleicht enthält Informationen, dass würde das problem erklären...
Error Array ( )
Und was enthält $return_val variable ?
InformationsquelleAutor YohannP
Noch ein paar Hinweise
Für das Debuggen immer wickeln Sie Ihre exec/shell_exec Funktion in
var_dump()
.error_reporting(-1);
sein sollten, wie solltedisplay_errors
, als letzten Ausweg auchset_error_handler("var_dump");
- wenn auch nur um zu sehen, ob PHP selbst nicht aufrufenexecvp
oder anderes.Verwenden
2>&1
(Zusammenführen der Schalen STDERR zu STDOUT-stream), um zu sehen, warum ein Aufruf schlägt fehl.In einigen Fällen müssen Sie möglicherweise wickeln Sie den Befehl in einer zusätzlichen shell-Aufruf:
Sonst die log-Datei umleiten wie empfohlen von @Mike ist das empfehlenswerteste Ansatz.
Wechseln zwischen den verschiedenen exec-Funktionen aufzudecken, die Fehlermeldungen sonst. Während Sie meistens tun die gleiche Sache, die Ausgabe return-Wege sind unterschiedlich:
exec()
→ entweder gibt die Ausgabe der Funktion führen, oder durch die optionale$output
Parameter.Bietet auch eine
$return_var
- parameter enthält die errno - /exit-code der Anwendung ausführen oder shell. Sie könnten:ENOENT
(2) - No such fileEIO
(127) - IO-Fehler: Datei nicht gefundenshell_exec()
→ ist das, was Sie wollen, laufen vor allem für shell-Stil Ausdrücken.Werden Sie sicher zuordnen/drucken der return-Wert mit z.B.
var_dump(shell_exec("..."));
`
inline backticks → sind identisch mitshell_exec
.system()
→ ist ähnlichexec
, aber gibt immer die Ausgabe als Funktion Ergebnis (ausdrucken!). Zusätzlich ermöglicht die zur Erfassung der Ergebnis-code.passthru()
→ ist eine weitereexec
alternative, aber immer sendet STDOUT Ergebnisse zu PHPs output-Puffer. Die oftmals lässt es die meisten Formstück-exec-wrapper.popen()
oder besserproc_open()
→ erlauben, individuell zu erfassen, STDOUT und STDERR.Meisten shell-wind-up-Fehler in der PHP-oder Apache -
error.log
, wenn Sie nicht umgeleitet. Überprüfen Sie Ihre syslog-oder Apache-log, wenn sich nichts ergibt eine nützliche Fehlermeldung aus.Häufigsten Fragen, die
Wie erwähnt von @Kuf: für veraltete webhosting-Pläne, Sie könnte immer noch
safe_mode
oderdisable_functions
aktiviert. Keiner von den PHP-exec-Funktionen arbeiten. (Am besten zu finden, eine bessere Anbieter, sonst untersuchen "CGI" - aber nicht installieren von eigenen PHP-interpreter, während unversed.)Ebenso kann AppArmor /SELinux /Firejail manchmal sein. Diese begrenzen den einzelnen Anwendungen-Fähigkeit, um zu laichen neue Prozesse.
Den beabsichtigten binary nicht vorhanden. So ziemlich kein Webhoster nicht haben tools wie
ffmpeg
vorinstalliert. Sie können nicht nur laufen, beliebige shell-Befehle ohne Vorbereitung. Einige Dinge installiert werden müssen!Den
PATH
ausgeschaltet ist. Wenn Sie die Installation von benutzerdefinierten tools, die Sie benötigen, um sicherzustellen, Sie sind erreichbar. Mitvar_dump(shell_exec("ffmpeg -opts"))
durchsucht alle üblichen Pfade - oder als Apache wurde gesagt/eingeschränkte (oft nur/bin:/usr/bin
).Check mit
print_r($_SERVER);
was Ihr PFAD enthält und wenn, deckt das tool, das Sie ausführen wollte. Sonst müssen Sie möglicherweise anpassen der server-Einstellungen (/etc/apache2/envvars), oder verwenden Sie vollständige Pfade:Dies ist etwas, um das shell-Konzept. Ich persönlich glaube nicht, dass dies vorzuziehen. Macht es Sinn für Sicherheit Absichten; Sie sind zudem für die Verwendung einer benutzerdefinierten installation natürlich.
Berechtigungen
Um eine binäre auf BSD/Linux-system gemacht werden muß "ausführbar". Dies ist, was
chmod a+x ffmpeg
tut.Furthermode der Weg zu solch benutzerdefinierte Binärdateien werden muss, lesbar von der Apache-Benutzer, die Ihre PHP-Skripte laufen unter.
Mehr zeitgemäß-setups verwendet PHPs builtin FPM-Modus (suexec+FastCGI), wo Ihr webhosting-Konto entspricht das, was PHP läuft mit.
Test mit SSH. Es sollte eine Selbstverständlichkeit, aber vor dem ausführen der Befehle über PHP, testen Sie es in einem echten shell wäre sehr sinnvoll. Sonde mit z.B.
ldd ffmpeg
wenn alle lib-Abhängigkeiten sind es, und wenn es funktioniert ansonsten.Input-Werte (GET, POST, DATEI-Namen, Benutzer-Daten) übergeben bekommen als Argumenten in exec strings müssen escaped werden mit
escapeshellarg()
.Sonst bekommst du shell-syntax-Fehler leicht; und wahrscheinlich exploit-code zu einem späteren Zeitpunkt installiert...
Achten Sie darauf, nicht zu kombinieren mit backticks eine der
*exec()
Funktionen:Backticks würde den Befehl ausführen, und lassen Sie shell_exec mit der Ausgabe des schon lief Befehl. Verwenden Sie den normalen Anführungszeichen für die Verpackung der Befehl parameter.
Überprüfen Sie auch in einer shell-Sitzung, wie sich das beabsichtigte Programm arbeitet mit einem anderen Konto:
Insbesondere für PHP-FPM-setups zu testen, mit der entsprechenden Benutzer-id.
www-data
/apache
sind meist nur von alten mod_php setups.Viele cmdline-tools hängt von einigen pro-Benutzer-Konfiguration. Dieser test wird verraten oft, was fehlt.
Auf Windows -
CMD Aufrufe wird nicht spielen schön mit STDERR-streams oft.
Jeden Fall versuchen, ein Powershell-script laufen zu lassen, CLI-apps anderes, oder verwenden Sie eine Befehlszeile wie:
Verwenden Sie vollständige Pfade und bevorzugen die Schrägstriche immer (
"C:/Program Files/Whatevs/run.exe"
mit zusätzlichen Anführungszeichen, wenn die Pfade Leerzeichen enthalten).Herauszufinden, die service-und SAM-Konto IIS/Apache und PHP läuft. Überprüfen Sie Berechtigungen ausgeführt hat.
Können Sie nicht laufen-GUI-apps in der Regel. (Typischer workaround ist der Aufgabenplaner oder WMI Aufrufe.)
InformationsquelleAutor mario