[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 &
  • Danke für's Tutorial. Wird mir bestimmt noch mal helfen :)



    Ein anderer Dienst zum bauen von Android Apps ist der App Inventor
    Kann ich sehr empfehlen. Oder per jQuery Mobile eine Website die dann jedes Gerät aufrufen kann

    Kelvin


  • 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

    Edited once, last by M4RC ().

  • 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):

  • Vielen Dank für deinen Input. Gefällt mir gut.

  • $_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'); }
  • 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>";
    ?>
  • Quote

    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

    Edited once, last by Towerle ().

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