Mit PHP Shell Script ausführen?
Hi Community, und zwar möchte ich mithilfe von php ein shell script ausführen und den rückgabewert abfangen.
Mein Shell script: (/home/pi/test.sh)
var=$(sudo gatttool -b 50:F1:4A:50:9C:97 --char-write-req --handle=0x0025 --value=32 --listen >> logfile.txt &)
A=$!
sleep 2
kill $A
echo "$var"
exit 0
und nun bräuchte ich ein php skript (Speicherort: /var/www/html/test.php)das dieses Skript ausführt und den Rückgabewert in eine Variable speichert. Jegliche Versuche von mir sind leider gescheitert...
Gruß Physikgr.
2 Antworten
Sollte eigtl ganz einfach sein:
<?php
$res = shell_exec('/home/pi/test.sh');
Dann hättest du in $res den Wert, den das Shellscript ausgibt. Vorher am besten überprüfen, ob die Funktion shell_exec() überhaupt freigegeben ist, das ist standardmäßig in der Regel nicht der Fall, dann ggf in der php.ini bei "disable_functions" die shell_exec entfernen.
Deine PHP-Seite läuft unter einem bestimmten
nicht-root-User, bei apache2 ist dies meistens www-data. Dein Bash-Script
benötigt aber Root-Rechte, da du gatttool mit sudo startest. Wenn du daher mit
PHP (shell_exec) das Bash-Script startest, wird es nicht erfolgreich ausgeführt
werden können.
Deshalb die Frage, ist es irgendwie möglich, dass gatttool
auch ohne root gestartet werden kan? Und wenn es nicht möglich wäre, würde ich
das sudoers File anpassen. Im suoders File kann definiert werden, welcher
nicht-root-User Berechtigungen hat "Root-Kommandos" mittels sudo
auszuführen.
Für dein Zwecke, kannst du im sudoers File (visudo)
folgendes eintragen:
<User für PHP (bei apache2 www-data)> ALL=NOPASSWD:
<Pfad zum Bash-Script>
zB
www-data
ALL=NOPASSWD: /usr/sbin/Script
Wichtig: Das Bash-Script sollte sich in einem
Systemverzeichnis befinden (/bin, /sbin, /usr/bin, /usr/sbin, ..), auf dem nur
root Berechtigungen hat. Wenn ein Script in einem Verzeichnis ist, auf dem auch
andere User Berechtigungen haben, könnte ein Angreifer das Script austauschen
und mit eigenem Code, welcher als root ausgeführt wird, versehen. So könnte das
ganze System komprimitiert werden.
@kernash
Wie halt einfach sudo getippt wird, ohne wirklich zu verstehen, was sudo eigentlich ist.
Ja - es gibt einen Grund, wieso man sudo erfunden hat - und nicht einfach su -c nimmt.
Mit sudo lassen sich Rechte extrem feingradig vergeben und - wie von mir vorgeschlagen - eben nur das eine Skript mit z.B. root-Rechten von einem anderen Benutzer ausführen lassen.
Natürlich muss man auch auf ein paar Sachen aufpassen (wie z.B. dass die Datei z.B. root gehört und auch nur root drauf schreiben darf und für den Ordner, wo die Datei drinnen liegt, ähnliches gilt oder Sticky gesetzt ist) - aber damit lassen sich definitiv schöne Sachen machen.
@PhysikgrAlso ein bisschen Eigeniniative wäre auch schon angebracht.
Ich halte es für duchaus zumutbar, mal die manual pages durchzuelsen. In diesem Fall (nebenbei: Auch bei deiner Frage allgemein) reicht 2 Minuten in Google eingeben.
Wie man sudo konfiguriert ist nun wirklich kein Geheimnis. Im Zweifelsfall halt mal auf wiki.ubuntuuser klicken...
Ach ja: Ganz unabhängig davon, dass ich mich gerade frage, was denn der Sinn hinter dem & in der Command substitution ist - also das da:
var=$( ...... &)
So wie du dir das vorstellst (also dass der Befehl dann im Hintergrund ausgeführt wird), ist das nämlich irgwendwie nicht...
Kommt auf dein System an, ich würde erstmal hier nachsehen:
/etc/php5/apache2/php.ini
Ggf halt die PHP Version entsprechend anpassend.
Allerdings scheinst du den Rückgabewert ja sowieso in eine logfile.txt zu schreiben, dann könntest du natürlich das Shellscript auch einfach über einen Cronjob regelmäßig ausführen und via PHP dann nur noch (z.B. einfach via file_get_contents()) die Logfile auslesen, dann könntest du das mit dem shell_exec() komplett weglassen.
Vermutlich wird das in diesem Fall scheitern, da wwwdata kein sudo-user ist, und auch nicht sein sollte.