[Tutorial] Raspberry über Webinterface steuern - Shellskripte ausführen

  • Hallo,

    hier möchte ich eine Möglichkeit aufzeigen, bequem über ein Webinterface Shellskripte auszuführen.


    Zuerst wird ein Webserver mit PHP installiert:

    Code
    sudo apt-get install lighttpd
    sudo apt-get install php5-common php5-cgi php5
    sudo lighty-enable-mod fastcgi-php
    sudo service lighttpd force-reload

    Außerdem müssen die Rechte für den Benutzer www-data angepasst werden:

    Code
    sudo chown www-data:www-data /var/www
    sudo chmod 775 /var/www
    sudo usermod -a -G www-data pi

    Um in den Skripten Befehle als Root ausführen zu können, kann z.B der Benutzer www-data in die /etc/sudoers eingetragen werden:

    Code
    sudo visudo


    Am Ende einfügen:

    Code
    www-data ALL=(ALL) NOPASSWD: ALL


    Speichern mit Strg+X , Y, Enter.
    Wenn der Webserver öffentlich im Netz verfügbar gemacht wird, stellt dies eine Sicherheitslücke dar.
    Die Forensuche nach sudo webscript hilft dann weiter.


    Als nächstes wird die Datei/var/www/index.php erstellt:

    Code
    sudo touch /var/www/index.php

    In dieser Datei findet fortan die Konfiguration des Webinterfaces statt.

    Beispielhaft hier ein Webinterface mit 3 Buttons:

    Erklärung:

    Code
    if (isset($_POST['Skript1'])) { shell_exec("sudo bash /var/www/skript1.sh"); }



    Der Button mit der Bezeichnung Skript1 führt das Skript /var/www/skript1.sh aus.
    Dazu muss das Skript /var/www/skript1.sh ausführbar sein:

    Code
    sudo chmod +x /var/www/skript1.sh


    Erwähnenswert:
    Es kann vorkommen, dass das Webinterface stehen bleibt. Abhilfe schafft, im Shellskript die Ausgaben der Befehle umzuleiten:

    Code
    befehl > /dev/null 2>&1 &
  • [Tutorial] Raspberry über Webinterface steuern - Shellskripte ausführen? Schau mal ob du hier fündig wirst!


  • Jetzt müssen wir noch die [font="Verdana,sans-serif"]Datei[/font][font="Verdana,sans-serif"] /etc/sudoers[/font] bearbeiten. Ohne diesen Schritt hat es zumindest hier nicht funktioniert. Außerdem wird es uns hiermit erlaubt, später in den Skripten Root-Rechte zu verwenden. (z.B wichtig für den Neustart). Wenn der Server nur lokal im eigenen Netzwerk betrieben wird, sehe ich hier auch keine Gefahren.

    Wir Öffnen die /etc/sudoers mit dem Befehl

    Code
    sudo nano /etc/sudoers


    und fügen ans Ende folgendes ein:

    Code
    www-data ALL=(ALL) NOPASSWD: ALL

    Hier sollte man unbedingt stärker darauf hinweisen das dies auf keinen Fall in dieser Form gemacht werden sollte sofern der Webserver übers Internet zugänglich gemacht wird!

    Insbesondere das dem Benutzer www-data erlaubt wird über sudo ALLe Befehle mit root Rechten auszuführen, stellt ein enormes Sicherheitsrisiko dar!


    Sicherer und sinnvoller wäre es über ein sog. sudowebscript (oben rechts Forumsuche danach)


    Desweiteren würde ich hier nicht beschreiben wie man /etc/sudoers selber mit einem Editor bearbeitet sondern über den dafür vorgesehenen Befehl visudo , damit die Änderung verifiziert und somit sichergestellt wird das der Eintrag auch korrekt ist und die /etc/sudoers nicht zerschossen werden würde


    Code
    #! /bin/bash
    
    
    pkill mplayer
    mplayer http://laut.fm/swingsalon > /dev/null 2>&1 &


    Ganz wichtig ist die Umleitung aller Ausgaben nach /dev/null, da die Oberfläche unserer App sonst stehen bleibt nachdem wir einen Button gedrückt haben. Jene Umleitung empfehle ich in diesem Setup bei jedem Befehl. Syntax hierzu:

    Code
    befehl > /dev/null 2>&1 &

    Das ist so leider nicht ganz richtig ; nicht die Umleitung nach /dev/null sorgt dafür dass das App(?) nicht stehen bleibt, sondern das & am Ende der Zeile - damit wird der Befehl in den Hintergrund geschickt und nicht gewartet bis er beendet wurde.

    Die Umleitung der Ausgaben muss man aber auch nicht im Script selber, hinter jedem befehl der möglicherweise was ausgibt, setzen sondern kann das auch gleich ins PHP Script einfügen


    Leider hast du in deinem PHP/HTML Script enorm viele Leerzeilen, was das ganze ziemlich unübersichtlich macht, auch die Formatierung lässt zu wünschen übrig :(
    Oder was zB diese Zeile soll kann ich auch nicht nachvollziehen:

    Code
    <script type="text/javascript"></script>
  • Erstmal schönes tutorial :) die php könnte effizienter sein, aber reicht völlig :) die app wäre ja sehr leicht. Würde mit der Java-sdk ein webview machen und die seiten in die assets laden! Die app brauch dann zum starten kein Internet und es reicht ja dann eine "anfrage" zu senden, sodass apache das brav ausführt! Dann würde ich aber dafür sorgen dass nur eine seite mit einer kurzen Antwort aufgerufen wird aus der app :) am besten ohne css :) dann sind wir komplett internetsparend und schnell. :) wäre bereit eine app zu entwickeln wenn du das alles veröffentlichen willst :) is ja net soo aufwendig ;)


    Marc

    ----
    Geschrieben mit tapatalk

    Einmal editiert, zuletzt von M4RC (12. März 2014 um 09:49)

  • Das mit dem & stimmt nur in der Theorie. Solange ein Befehl eine Ausgabe hat, wartet PHP.

    Den App-Inventor kann ich nicht empfehlen. Die Seite ist damit später extrem langsam und das Scrollen geht nicht flüssig.

    Die Leerzeilen im Code sind absicht - So kann ich da leichter neue Buttons einfügen. Geschmacksache :)

    Die Javascript-Zeile gehört dort eigentlich nicht hin, stimmt.

  • Aber du hast ja nicht nur bei den Buttons abnormal viele Leerzeilen... Die machen das ganze Konstrukt unnötig unübersichtlich - an jeder stelle, nicht nur bei den Buttons - und so schwer ist das ja nun auch nicht für einen neuen Button ne neue Zeile einzufügen?
    Davon ab is die Formatieren zum Beispiel bei den div's kaputt - so macht es halt echt keiner ... also Ordentlicher sähe das anders aus - oder 12x <br> könnte man vielleicht auch mit einem formatierten <p> vereinfachen ;) Wobei dazu gesagt ein <br> auch geschlossen werden müsste, weswegen man das eigentlich so schreibt: <br/>

    Und das <b> sowie <nobr> schließt du vor dem <form>, allerdings hast du die genau andersherum geöffnet... Also du machst erst <nobr> dann <b> und dann <form>, also müsstest du am Ende eigentlich erst </form> dann </b> und dann erst </nobr> machen

    Wenn man das soweit beachten würde, wär das Script schon mal wesentlich übersichtlicher, leichter zu lesen und auch kürzer ... Hier mal Dein Script und deins von mir überarbeitet (Leerzeilen sowie Formatierung korrigiert):

    Spoiler anzeigen


    Deins aus Beitrag#1

    /var/sudowebscript.sh Script erstellen:

    Script ausführbar machen:

    Code
    chmod a+x /var/sudowebscript.sh


    ...man könnte das sudowebscript auch ohne Kontrolle machen ob der übergebene parameter im case existiert, aber das würde ich nicht empfehlen da das ebenfalls unsicher wäre[/spoiler]

    Siehe dazu auch: Befehle über PHP mit root Rechten ausführen (sudo webscript)

  • $_GET hätte zwar den Vorteile das man Hyperlinks anstatt Buttons nutzen könnte aber $_GET wäre anfälliger - also zumindest sicherheitstechnisch betrachtet wäre $_POST die bessere Wahl ;)

    und ein switch würde die Flexibilität wieder einschränken, dann müsste man nicht nur den HTML Code um eine Schaltfläche erweitern sondern auch die switch Schleife

  • Kleines Update:

    Wenn man im PHP-Teil als Button-Aktion auf eine weitere PHP-Seite verweist, kann man eine Art Menü simulieren.

    Code
    if (isset($_POST['buttonA'])) { header('Location: anderedatei.php'); }
  • Das geht aber auch nur in diesem speziellen Fall solange es noch keine andere Ausgabe gegeben hat - würde man den ersten PHP Teil unterhalb des "html Eröffnungscodes" setzen könnte man den header nicht mehr ändern

  • Hi,

    ich hab das Tut jetzt so weit verstanden und auf meinem Pi umgesetzt.

    Ich komm nur nicht auf meine Index.php

    Ich geh ganz normal mit meinem Bowser auf meinem PC per IP auf den Pi.
    Das funktioiniert schon mal nicht.

    192.168.178.35/var/www/index.php

    was mache ich falsch?

    Das zweite ist, wie erstelle ich auf appsgeyser.com meine App? Wo kann ich da die IP meines Pi`s eintragen?

    Grüße und vielen Dank

  • Hallo,

    die IP sollte genügen. Versuche mal im Browser:

    192.168.178.35

    Wenn das klappt, ist die App in 5 Minuten erstellt. Das kann ich dir dann nochmal genauer beschreiben.

  • Hallo Zusammen,

    ich benutze deine Websteuerung zur Steuerung meiner Webcam (Überwachung), ich und meine Freundin schalten damit die Camera Ein/Aus nun ist meine Frage gibt es eine möglichkeit das mir ein Status zurück gemeldet wird? zb. das echo aus dem Script?

    danke für das super Tutorial :thumbs1:

  • Hallo,

    du kannst im Shellskript die Ausgabe in eine Datei umleiten, und dann den Inhalt der Datei mit PHP ausgeben:

    PHP
    <?php
    //Info ausgeben
    $text = shell_exec("cat /home/pi/textdatei");
    echo "<p style='text-align: center';><span style=font-size:35px;><strong>$text</strong></span></p>";
    ?>
  • Zitat

    Das könnte man jetzt sogar noch einfacher gestalten indem man einfach nur oben eine Variable mit den Button-Namen sowie dem Script-Namen setzen müsste und alles weitere würde der PHP Code übernehmen

    Das würde mich interessieren, falls du mal Zeit findest.:thumbs1:

  • Hallo,
    ich lese gerade mit Begeisterung dieses Tutorial.
    Soweit ist alles in Ordnung. Ich komme nur mit zwei Dingen nicht klar. Könnt ihr mir freundlicherweise auf die Sprünge helfen?:bravo2:

    Und zwar:

    Wo soll ich meine eigentlichen Skripte speichern. "meigrafd" verweist darauf, die "/var/sudowebscript.sh" zu erstellen und entsprechend zu befüllen.

    Der PHP-Code der index.php verweist in den Zeilen....

    angeklickt wird, dann wird auf den Eintrag des "sudowebscript.sh" zu der Zeile

    verwiesen. Aber alle Einträge in dem "sudowebscript.sh" verweisen doch auf die Variable $1.sh in var/www/. Es würde ja immer das gleiche Script aufgerufen, oder?

    Wo mache ich den den Fehler? Meine Scripte heißen bspw. start.sh, stop.sh und reboot.sh.

    Wo verweise ich darauf, dass beim Klick auf den Button der index.php das Script "start.sh" aufgerufen wird?

    ....und zweitens ist mir aufgefallen, dass wenn ich die php.ini auf meinem Smartphone aufrufe der Text auf den "Button" unterschlagen wird. Die Befehle werden ausgeführt und der Button an sich wird angezeigt, nur der Text auf dem Button fehlt.

    Im Browser auf dem PC ist alles sichtbar.

    Danke für eure Hilfe

    Einmal editiert, zuletzt von Towerle (14. Februar 2015 um 22:22)

  • Wenn du Code postest dann bitte in einen entsprechenden 'tag' setzen, in diesem Fall [php ] code [/php ] (ohne Leerzeichen), es geht aber auch [code ] usw..


    An das sudowebscript.sh Script werden Parameter/Argumente übergeben. Jedes Argument wird anhand eines Leerzeichens/Leerstelle vom nächsten unterschieden. So würde zum Beispiel bei

    Code
    ls -la /tmp

    das ls der Befehl oder das Script sein, -la das erste Argument und /tmp das zweite Argument.

    Die meisten Programmiersprachen handhaben das als "Arguments" oder kurz: arg beziehungsweise args

    Dem Script sudowebscript.sh wird ein Argument übergeben, nämlich der Inhalt der Array-Variablen $_POST['button'] was zum Beispiel swing sein könnte.
    $_POST ist ein Array, 'button' ist der Schlüsselwert des Arrays ($what) und $_POST['button'] beinhaltet letztlich die Value ($arg)

    Im Fall des bash Scripts (oder sh, das ist egal) beinhaltet die standardisierte Variable $1 das erste Argument, $2 das zweite Argument usw. Das ans Script übergebene Argument ist flexibel, je nach Aufruf kann der Inhalt von $1 anders sein.
    Das case $1 ist eine Schleife und prüft den Inhalt von $1 ob eine "case Klausel" darauf zutrifft bzw matched.

    Führt man sudowebscript.sh swing aus ist der Inhalt der Variablen $1 -> swing
    Führt man sudowebscript.sh bla aus ist der Inhalt der Variablen $1 -> bla


    ... Das sollte jetzt eigentlich alle Fragen beantworten ...

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!