Mit PHP Shell Script ausführen?

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.




Physikgr 
Fragesteller
 20.07.2017, 15:59

Wo ist den diese php.ini datei?

0
mastema666  20.07.2017, 16:39
@Physikgr

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.

0
Linuxhase  20.07.2017, 19:39
@Physikgr

@Physikgr

Wo ist den diese php.ini datei?

mit

find / -name "php.ini"

lässt sich die jede Datei (oder Verzeichnis) leicht finden.

Linuxhase

0
kernash  20.07.2017, 16:08

Vermutlich wird das in diesem Fall scheitern, da wwwdata kein sudo-user ist, und auch nicht sein sollte.

1
Physikgr 
Fragesteller
 20.07.2017, 16:25
@kernash

@kernash

Wie kann ich das den sonst umsetzen?

0
kernash  20.07.2017, 16:31
@Physikgr

Entweder du passt die Umgebung von gattool so an, dass es ohne root-rechte läuft.


Oder du lässt die Ausgabe von deinem Script in ein Logfile schreiben und php liest dann das Logfile.

0
Physikgr 
Fragesteller
 20.07.2017, 16:38
@kernash

Wenn ich das mit der logfile nehmen würde müsste ich doch immer das skript per hand ausführen, oder?

0
kernash  20.07.2017, 16:40
@Physikgr

Ja. Du könntest aber das Script permanent laufen lassen und nur immer die aktuellsten Zeilen im Logfile lassen.

0
kernash  20.07.2017, 16:50
@Physikgr

Gibt es einen Grund warum das mit root laufen muss?

Mit udev rules kann man z.B. einstellen welche group auf welche Geräte zugreifen darf.

0
Tuxgamer2  20.07.2017, 16:56
@kernash

Oder man erlaubt das Skript für den Webserver-User und sudo.

0
kernash  20.07.2017, 17:14
@Tuxgamer2

Ein webserver der root befehle ausführen darf? bitte nicht.

1
FritzFuchs27  20.07.2017, 17:18
@kernash

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.

2
Tuxgamer2  20.07.2017, 17:24
@kernash

@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.

@Physikgr

Also 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...

2
Tuxgamer2  20.07.2017, 17:36
@kernash @Physikgr

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...

0