Ich versuche, ein Python-Skript über PHP mit dem folgenden Befehl auszuführen:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
PHP erzeugt jedoch einfach keine Ausgabe. Die Fehlerberichterstattung ist auf E_ALL gesetzt und display_errors ist aktiviert.
Folgendes habe ich versucht:
- Ich verwendet
python2
,/usr/bin/python2
undpython2.7
statt/usr/bin/python2.7
- Ich habe auch einen relativen Pfad anstelle eines absoluten Pfads verwendet, der auch nichts geändert hat.
- Ich habe versucht , die Befehle
exec
,shell_exec
,system
.
Allerdings, wenn ich renne
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
es funktioniert einwandfrei, shutdown now
macht aber nichts.
PHP hat die Berechtigung, auf die Datei zuzugreifen und sie auszuführen.
EDIT: Dank Alejandro konnte ich das Problem beheben. Wenn Sie das gleiche Problem haben, vergessen Sie nicht, dass Ihr Webserver wahrscheinlich / hoffentlich nicht als Root ausgeführt wird. Melden Sie sich als Benutzer Ihres Webservers oder als Benutzer mit ähnlichen Berechtigungen an und versuchen Sie, die Befehle selbst auszuführen.
Antworten:
Getestet auf Ubuntu Server 10.04. Ich hoffe es hilft dir auch unter Arch Linux.
Verwenden Sie in PHP die Funktion shell_exec :
test.py
Überprüfen Sie in der Python-Datei diesen Text in der ersten Zeile: (siehe shebang EXPLAIN) :Außerdem muss die Python-Datei über die richtigen Berechtigungen verfügen (Ausführung für den Benutzer www-data / apache, wenn das PHP-Skript im Browser oder Curl ausgeführt wird) und / oder "ausführbar" sein. Außerdem müssen alle Befehle in der
.py
Datei die richtigen Berechtigungen haben:Entnommen aus dem PHP-Handbuch :
So machen Sie eine Datei auf Unix-Plattformen ausführbar :
quelle
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
oder:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Ich empfehle,
passthru
den Ausgabepuffer direkt zu verwenden und zu handhaben:quelle
Wenn Sie den Rückgabestatus des Befehls wissen und die gesamte
stdout
Ausgabe erhalten möchten, können Sie Folgendes verwendenexec
:$out
ist ein Array aller Zeilen.$status
ist der Rückgabestatus. Sehr nützlich zum Debuggen.Wenn Sie auch die
stderr
Ausgabe sehen möchten, können Sie entweder mit proc_open spielen oder einfach2>&1
zu Ihrer hinzufügen$command
. Letzteres reicht oft aus, um die Dinge zum Laufen zu bringen und viel schneller zu "implementieren".quelle
Alejandro hat es geschafft und die Ausnahme (Ubuntu oder Debian) klarer gemacht - ich habe nicht den Repräsentanten, der der Antwort selbst etwas hinzufügen kann:
Sudoers Datei:
sudo visudo
Ausnahme hinzugefügt:
www-data ALL=(ALL) NOPASSWD: ALL
quelle
Um zu klären, welcher Befehl je nach Situation verwendet werden soll
exec()
- Führen Sie ein externes Programm aussystem()
- Führen Sie ein externes Programm aus und zeigen Sie die Ausgabe anpassthru()
- Führen Sie ein externes Programm aus und zeigen Sie die Rohausgabe anQuelle: http://php.net/manual/en/function.exec.php
quelle
In meinem Fall musste ich einen neuen Ordner im
www
Verzeichnis namens erstellenscripts
. Innerhalb habescripts
ich eine neue Datei namens hinzugefügttest.py
.Ich habe dann
sudo chown www-data:root scripts
und verwendetsudo chown www-data:root test.py
.Dann ging ich in das neue
scripts
Verzeichnis und benutztesudo chmod +x test.py
.Meine test.py Datei sieht so aus. Beachten Sie die unterschiedliche Python-Version:
Von PHP mache ich jetzt folgendes:
Und du solltest sehen: Hallo Welt!
quelle
Die obigen Methoden scheinen komplex zu sein. Verwenden Sie meine Methode als Referenz.
Ich habe diese beiden Dateien:
run.php
mkdir.py.
Hier habe ich eine HTML-Seite erstellt, die eine GOSchaltfläche enthält . Wenn Sie diese Taste drücken, wird ein neuer Ordner in dem Verzeichnis erstellt, dessen Pfad Sie angegeben haben.
run.php
mkdir.py.
quelle
Dies ist so trivial, wollte aber nur jedem helfen, der bereits Alejandros Vorschlag befolgt hat, aber auf diesen Fehler gestoßen ist:
Wenn jemand auf diesen Fehler gestoßen ist, muss Alejandro eine kleine Änderung an der PHP-Datei vornehmen:
quelle