Raspberry über UDP/TCP herunterfahren??

  • Hallo
    Ich möchte gerne meinen Raspberry über ein UDP oder TCP Befehl herunterfahren, habe aber leider überhaupt gar keine Ahnung, wie ich dies anstellen soll??!!

    Habe in einem anderen Forum dieses gefunden:
    #!/usr/bin/env python
    import subprocess
    import socket
    s = socket.socket()
    s.bind(('0.0.0.0',23))
    s.listen(0)
    s.accept()
    subprocess.call(('/sbin/shutdown',))

    Hierzu müsste ich doch erst mal Port 23 "freischalten", oder??
    Wie stelle ich dies an??

    Bin echt für jede Hilfe dankbar!!!

    Vielen Dank

  • Ports muss man nicht aufmachen, die sind einfach da.
    Das Verfahren scheint mir aber hoechst fahrlaessig. Ein Portscan
    und der PI faehrt runter !

    Ich poste mal das File, bevor ich es probiere:

    Python
    #!/usr/bin/python
    import subprocess
    import socket
    s = socket.socket()
    s.bind(('0.0.0.0',23))
    s.listen(0)
    s.accept()
    subprocess.call(['/sbin/shutdown',"-h","now"])



    Ich bin wieder da ...

    Unter Knoppix funktioniert das Script wie ich es gepostet habe :)

    Einmal editiert, zuletzt von Tell (22. September 2014 um 11:14)


  • Ports muss man nicht aufmachen, die sind einfach da.

    Jein.
    Standardports können auch bereits belegt sein, dann kann man sie nicht nochmals verwenden. Ports unter 1024 können zudem nur von root verwendet werden.

    23 ist der Standard Port für einen Telnet Server.
    Ob der bereits verwendet wird lässt sich wie folgt prüfen:

    Code
    netstat -tulpen | grep ":23"

    Kommt da nix raus ist er frei.

    Das Verfahren scheint mir aber hoechst fahrlaessig. Ein Portscan und der PI faehrt runter !

    Vorausgesetzt der Port ist übers Internet erreichbar, was ich aber zunächst mal nicht annehmen würde da dafür meistens erst mal eine Port-Weiterleitung eingerichtet werden müsste.

    Aber dennoch gebe ich Tell recht, man sollte da zumindest eine Art Password abfragen.
    In der Form wie das Script aufgebaut ist wird der Befehl sofort ausgeführt sobald eine Verbindung aufgebaut wurde. Man sollte da also lieber noch eine Abfrage einbauen.

  • Danke für Eure schnellen Antworten.
    Es soll erst mal nur ein Versuch sein.
    Ich verwende einen Gira Homeserver für EIB/KNX und möchte gerne hiermit den PI herunterfahren.
    Quasi Befehl zum herunterfahren senden und dann nach ca. 1 Minute Steckd. für PI ausschalten.
    Mit dem Homerserver kann ich jedoch nur TCP oder UDP Befehle versenden.
    Siehe Bild:
    pi.jpg

  • Also grundsätzlich funktioniert dein oben genannter Code, er ist halt nur nicht sonderlich Schick und Sicher ;)

    Folgender Code sieht vielleicht ein bisschen kompliziert aus, beinhaltet aber 2 weitere Features:

    • Für jede Verbindung wird ein Thread ausgeführt/erstellt.
    • Ein shutdown wird nur dann ausgeführt wenn der in PASSWD hinterlegte String empfangen wurde.

      • Stimmt das abgesetzte PASSWD nicht überein wird die Verbindung getrennt aber das Script läuft weiter und es kann erneut eine Verbindung hergestellt werden.
      • Die Verbindung wird geschlossen sofern ein leerer String gesendet/empfangen wird.


    Desweiteren habe ich einige Checks eingebaut um einige Fehlermeldungen sauber abfangen zu können, wie zum Beispiel falls der PORT bereits verwendet und belegt ist.

    Spoiler anzeigen

    Das Script müsstest du dann halt beim starten des Systems automatisch starten lassen, siehe dazu >> hier <<

  • Danke für das erweiterte Script mit dem PW, aber ich müsste erst mal das normale zum laufen kriegen!!
    Problem sind anscheinend dir Ports, welche nicht verfügbar sind.
    Habe es jetzt mal zum testen auf Port 8888 gelegt und hiermit fährt der PI sofort herunter.
    Port 8888 wird aber von "Snakeberry" verwendet.
    Ich würde gerne z.B. Port 2000 nehmen, weiß aber nicht wie ich dies hinbekommen soll.

  • Wie bereits erwähnt darf nur root Ports unter 1024 verwenden. Wenn du das Script also als Benutzer pi ausführst musst du einen Port über 1024 nutzen.

    Und wie du einen anderen Port verwendest sollte eigentlich klar sein? Stell einfach im Python Script einen anderen ein :huh:
    ..such nach der 23 und ersetz diese mit 2000..

  • Ich habe ja die 23 durch 8888 zum testen ersetzt, was auch funktioniert.
    Ersetze ich diese aber durch Port 3000, so funktioniert es nicht.
    Am Raspberry sind halt nur die Ports: 22, 3389 und 8888 offen.

  • Am Raspberry sind halt nur die Ports: 22, 3389 und 8888 offen.

    Nein das ist Quatsch.
    Wie du selber sagst wird Port 8888 von "Snakeberry" verwendet, also ist der nicht "offen" da du den nicht 2x verwenden kannst.
    22 ist der Standard Port von SSH und 3389 ist der Standard Port von RDP.
    Bedeutet: Du kannst alle 3 Ports die du nanntest nicht noch mal verwendet da andere Dienste/Programme diesen bereits belegen! Siehe dazu auch >> hier <<

    Wie ich bereits oben sagte kann man anhand netstat -tulpen prüfen welche Ports derzeit verwendet werden.

    Man kann generell alle Ports bis maximal 65535 verwenden, sofern dieser selbstverständlich noch nicht belegt/verwendet wird (*ächtz* *sprunginplatte*)

    Da du mir leider immer noch nicht verraten hast als welcher Benutzer du das Script ausführst oder wie ggf die Fehlermeldung aussieht, kann ich dazu aber jetzt auch nix weiter sagen.

  • Was benutzt du denn? Den nackten PI oder die Grafische Oberfläche?
    Als welchen Benutzer meldest du dich am PI an?
    Sitzt du direkt davor mit Tastatur/Maus oder verbindest du dich über PuTTY?

    Wenn du ganz normal Raspbian nutzt und die Grafische Oberfläche - kombiniert damit das du anscheint RDP laufen hast - würde ich mal vermuten das du als Benutzer pi angemeldet bist.

    Und wenn weiter vermutet das du das Script ohne vorangestelltes sudo ausführst, wird das Script als Benutzer pi ausgeführt und darf somit keine Ports unter 1024 verwenden.

  • Ich benutze die gr. Oberfläche.
    Logge mich über eine Remotedesktopverbindung von meinen Win7 PC als "PI" ein.
    Hoffe konnte dir damit weiterhelfen.

    Das Startscript sieht so aus:
    #!/bin/bash
    python /root/shutdown.py

    Einmal editiert, zuletzt von Opelpower (22. September 2014 um 14:23)

  • oh man...

    Wenn du dich als Benutzer pi anmeldest, hast du eigentlich kein Recht auf irgendwelche Dateien anderer Benutzer zuzugreifen, also vorallem nicht im HomeDir von root ( /root/ ).
    Also entweder das Startscript wird mit vorangestelltem sudo ausgeführt, oder du hast dein System schon irgendwie vermurkst.

    Eine Fehlermeldung hab ich bisher auch noch nicht gesehen - von dem Versuch wo du es auf Port 2000 laufen lassen wolltest.

    Wenn du insofern nicht den Helfern zuarbeiten kannst/willst, wird das hier noch ewig so weiter gehen und es wird Tage dauern bis du es ans laufen gekriegt hast..

  • Ich würde ja gerne weiterhelfen, nur für mich ist Linux absolutes Neuland und ich habe bislang noch nie hiermit gearbeitet.
    Hab aber gerade mal das Script mit dem Befehl "Sudo" getestet und jetzt wird der Raspberry über den Port 3000 auch heruntergefahren :)

  • Ein Linux System herunterfahren darf natürlich nur jemand der dazu berechtigt ist und das ist normalerweise nur der Administrator (root).

    Dein zuvor beschriebenes Problem bezog sich aber auf den Port, nicht auf den auszuführenden Befehl...
    Von daher wäre es für die Zukunft besser wenn du detaillierter das genaue Problem beschreibst und nicht irgendwas anderes worums aber anscheint gar nicht geht.

  • Ich habe jetzt noch das Problem, dass es mal funktioniert und mal nicht??!!
    Es scheint mir fast so, als ob das Startscript nur sporadisch ausgeführt wird.
    Hab die rc.local angepasst, aber irgendwie scheint es nicht immer zu starten.
    Könnte mal jemand darüber gucken, ob diese so i.O. ist??
    Ist es mit dem & so richtig hinter jedem Befehl??
    Es soll halt nur Snakyberry und das Shutdown Script gestartet werden.

    rc.local:
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
    printf "My IP address is %s\n" "$_IP"
    fi
    date="$(date +'%Y%m%d')"

    nohup /home/pi/snakeberry/startSnakeberry.sh
    >/home/pi/snakeberry/logs/snakeberry_${date}.log 2>&1 &
    /home/pi/snakeberry/startshutdown.sh &

    exit 0

    Nochmal vielen vielen Dank für Eure Hilfe!!!!!!!!!!

  • Wenn du etwas postest dann bitte in CODE

    Dein Eintrag - so wie du ihn gepostet hast - ist fehlerhaft. Die Umleitung der Ausgabe in eine Datei muss hinter den Befehl

    Und was steht in /home/pi/snakeberry/startshutdown.sh ?
    Und die Datei ist auch ausführbar?
    smilie_glaskugel.gif

  • Ok, jetzt ab sofort in Code.....

    Ich poste mal alle Dateien.
    Übrigens ja, die startshutdown.sh ist ausführbar.

    startSnakeberry.sh

    Bash
    #!/bin/bash
    python /home/pi/snakeberry/snakeberry.py

    startshutdown.sh

    Bash
    #!/bin/bash
    sudo python /root/shutdown.py

    rc.local

Jetzt mitmachen!

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