Sudo, exec und das sudowebscript.

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo,




    Um die Funksteckdosen über das Webinterface zu steuern habe ich mich letztendlich für die Variante mit dem sudowebscript entschieden. Diese erscheint mir eine sichere und flexible Variante zu sein. Leider komme ich damit noch nicht so ganz klar, wie es mir scheint. Im folgenden poste ich einfach mal meine Skripte, php-dateien etc.



    Mein sudowebscript sieht zur Zeit aus wie folgt. Wie ihr erkennen könnt, habe ich mir hier im Forum umgeschaut ;)


    Die Rechte sehen aus wie folgt:


    Das Webinterface zum Steuern der Steckdosen und des Musikplayers sieht zur Zeit aus wie folgt. Dabei habe ich mich zum einen aus dem angesprochenen Tutorial sowie aus dem Forum hier bedient. Auch ein paar eigene Ideen sind eingeflossen (die Steuerung des Musikplayers...ohh welch Geniestreich...). Durch das Bedienen hier im Forum hab ich auch Teile für's debugging im Code, was euch vielleicht hilft. Wahrscheinlich ist der/sind die Fehler aber für euch eh offensichtlich.


    Auch hier noch die Rechte:


    Zuletzt noch die sudoers-datei:


    Ich hoffe, dass ihr mir helfen könnt und bedanke mich schon mal im Voraus für die Mühe :)



    Edit: Ich hab mal die Verbesserungen von meigrafd eingebaut, sowie für etwas mehr Lesbarkeit gesorgt. Weiter ist mir beim ganzen Verändern des Codes mittlerweile ein Fehler unterlaufen gewesen, den ich auch verbessert habe. Die Verbesserungen habe ich in grün kenntlich gemacht.

  • Im sudowebscript.sh übergibst du keine Parameter an den send Befehl. Was soll der denn dann machen :huh:


    Versuch es also mal damit:[code=php]#!/bin/bash
    #
    # sudo web script allowing user www-data to run commands with root privilegs
    #
    # required /etc/sudoers Entry:
    # www-data ALL=NOPASSWD:/var/sudowebscript.sh
    #


    case "$1" in
    remote) /home/pi/raspberry-remote/send $2 $3 ;;
    *) echo "ERROR: invalid parameter: $1 (for $0)"; exit 1 ;;
    esac


    exit 0[/php]So wird das zweite und dritte Parameter (oder Argument), welches an das Script übergeben wird, auch an den Befehl weitergegeben.
    Das 1. Parameter wäre "remote" und das 2. zB "11100" und das 3. wäre "1"



    Dann sieht aber auch noch dein Heimautomation.php komisch aus:
    [code=php]if(isset($_GET["Lampenein"])){
    exec('sudo /var/sudowebscript.sh remote '.'11100 1', $output, $return_var);
    }[/php]Was macht das '.' da :huh:



    Und zu guter letzt: Gewöhnt euch bitte an Einrückungen vorzunehmen, das lässt sich besser lesen.


    Unschön:[code=php]if(isset($_GET["Lampenein"])){
    exec('sudo /var/sudowebscript.sh remote 11100 1', $output, $return_var);
    }[/php]


    Besser:
    [code=php]if (isset($_GET["Lampenein"])) {
    exec('sudo /var/sudowebscript.sh remote 11100 1', $output, $return_var);
    }[/php]

  • Danke schon mal für deine Antwort. Wie du siehst hab ich das sudowebscript noch nicht ganz verstanden ;) Dein Beitrag war aber schon sehr hilfreich. Dummerweise habe ich im ersten Beitrag mittlerweile einen Fehler eingebaut. Der Send Befehl benötigt drei weitere Argumente und lautet beispielsweise .../send 11100 1 1. Dementsprechend habe ich die Quellcodes jetzt angepasst.




    Als Fehlercode kommt weiterhin: ERROR: General Error (Miscellaneous errors, such as 'divide by zero' and other impermissible operations).


    Wem sollte denn die Datei sudowebscript.sh gehören? root oder www-data, oder spielt das keine Rolle? Muss diese Datei noch in den Ordner /etc/sudoers.d reinkopiert werden oder reicht der Eintrag in die Sudoers-Liste?


    Anbei noch ein Screenshot des send-Befehls in der Kommandozeile. Vielleicht hilft es ja.
    sendbefehltjs2kfrwig.jpg


    Edit: Sobald ich nach Aufrufen des sudowebscripts einen Befehl eingebe, der dort nicht vermerkt ist, sollte doch eine Fehlermeldung kommen, sofern ich das richtig verstehe (dafür steht doch der Stern beim case, quasi ein else, oder?). Die kommt allerdings nicht. Heißt das nicht, dass das Skript überhaupt nicht ausgeführt wird?

  • Ok, dann ist das mit dem Besitzt zumindest mal geklärt :)
    Aber soweit ich das Beurteilen kann, hab ich die Datei doch ausführbar gemacht. Schau mal in meinen Eröffnungsbeitrag, da hab ich einen Screenshot von den Rechten. Das "x" steht doch dort für execute, oder nicht?

  • Hier, bitteschön :)
    befehle92rtb1h8l4.jpg


    Seh ich das richtig, dass die Kombination von sudo bash und dem Skript immer einen Weg darstellt, das Skript auf Fehler zu testen, bevor man es im Webinterface weiterverwendet?

  • Nein das ist kein genereller Weg um Fehler zu testen... Aber es vorher auf der Konsole auszuführen um zu prüfen obs geht ist im Sinne von Ausschlussverfahren schon nicht verkehrt :D


    Aber nun sieht man Deinen Fehler: Du scheinst das Script unter Windows erstellt zu haben. Linux versteht aber nicht die Zeilenumbruchszeichen von Windows. Deshalb auch zB der Fehler: /bin/bash^M


    Lösch das Script: rm -f /var/sudowebscript.sh
    Erstell es direkt unter Linux neu: nano /var/sudowebscript.sh
    und copy&paste den Inhalt rein
    Dann speichern+beenden und ausführbar machen.


    Für das nächste mal: Wenn du es unbedingt unter Windoof bearbeiten willst dann verwende einen Linux-kompatiblen Editor wie zB notepad++ oder UltraEdit.

  • Ahoi,


    du hast das Skript unter Windows erstellt und dann auf den Pi kopiert. Das führt zu Problemen, da Windows und Linux verschiedene Zeilenenden verwenden.


    Am besten löschst du das Skript:

    Code
    sudo rm /var/sudowebscript.sh


    Erstellst eine Datei:

    Code
    sudo touch /var/sudowebscript.sh


    Machst diese ausführbar:

    Code
    sudo chmod +x /var/sudowebscript.sh


    Öffnest die Datei in einem Editor:

    Code
    sudo nano /var/sudowebscript.sh


    Kopierst dort dann den Quellcode hinein, und schließt den Editor mit Strg+X, Y, Enter.
    Dann versuchst du den Aufruf erneut:

    Code
    /var/sudowebscript.sh remote 11100 1 1
  • Super vielen Dank :danke_ATDE: Das hat geholfen :thumbs1: Darauf wäre ich von selbst wohl nie gekommen, da hätte ich noch so viel im Netz lesen können :D
    Bisher habe ich mit komodo edit gearbeitet. Dieser Editior kann das wohl nicht^^ Werde dann wohl wechseln :)


    Eine Frage hätte ich grade noch, die nur am Rande was damit zu tun hat:
    Ich schreibe die Quellcodes zur Zeit an meinem Hauptrechner mit Windows 7 und möchte beispielsweise die Datei Heimautomation.php mit Hilfe WinSCP direkt ins Verzeichnis kopieren. In WinSCP bin ich als pi angemeldet und sobald die Datei www-data gehört, gibt es Probleme, obwohl pi zur Gruppe www-data gehört. Ich kann die Datei entweder löschen und sie dann rüberkopieren, dann muss ich aber die Rechte ändern, oder ich ändere kurzzeitig den Besitzer. Das muss doch komfortabler gehen. Eventuell mache ich hier auch wieder was grundlegendes falsch.

    • Official Post

    Sei root, der darf alles :). Abschliessend dann noch die gewünschten Dateirechte gesetzt, fertig.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.