{Strg} Zustand abfragen/prüfen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Leute,
    ich bräuchte nen Tip wie man in einem PythonScript die Taste {Strg} abfragt um passend zu reagieren. Finde im Netz nur ganze Projekte, wie man die ganze Tastatur überwacht.
    Kurze Vorstellung meiner Idee.
    RasPi startet ohne Benutzeroberfläche, sondern in der Kommandozeile
    Im Autostart wird ein PythonScript ausgeführt.

    ScriptStart
    Meldung "warte auf Eingabe..."
    Wartezeit 3 Sekunden

    Wenn {Strg} gedrückt dann
    Befehl "startX" (RaspBian laden)
    ansonsten
    Befehl "rdesktop..." (RemoteDesktop starten)
    Befehl "shutdown"
    Ende Wenn


    Hintergrund:
    der RasPi soll als ThinClient dienen.
    Sobald er Strom bekommt startet er anstatt dem OS eine RemoteDesktopVerbindung zum Server, wenn ich aber den RasPi umkonfigurieren will/soll, kann ich beim Booten mit der Strg-Taste bewirken, dass RemoteDesktop umgangen wird und stattdessen die grafische Benutzeroberfläche kommt.

    Danke :)

  • HAllo
    dbv: ich habe es erstmal nur unter Debian (startx) ausprobiert.
    Will mich nicht aussperren wenn ich rdesktop in Autostart packe.
    Mein Gedanke ist dass rdesktop anstatt startx gestartet wird. Jetz wo du nachfragst, muss ich gucken obs überhaupt möglich ist. Lool...

    meigrafd:
    Es reicht natürlich, wenn es irgendeine Taste ist. Ich komme aus der .NET Welt, da ist es ohne Probleme möglich. Auch kann man zwischen der linken und rechten Strg Taste wählen.

    Eine Alternative zu einer gedrückten Taste wäre auch ein Jumper, der bestimmte GPIO Pins überbrückt.

  • Hallo nochmal,
    habe jetzt eine noch einfachere Lösung gefunden.
    Im Internet hat sich schon einer mit dem gleichen Thema befasst und ein Lösungsweg beschrieben. Raspberry Pi als RDP-Client
    Funktioniert ganz gut. Durch die Funktion "anpingen bis der Server antwortet" bleibt das Betriebssystem aktiv und man kann die Startdatei anpassen wenn man den RasPi mit abgezogenem Netzwerkkabel startet.

    Mein Problem ist jetzt, dass der RasPi nach dem Abmelden vom RDP-Server nicht automatisch herunterfährt, sondern Debian (startx) weiterhin anzeigt. Hier hat einer das gleiche Problem.

    Hat einer ne Idee, wie man im Script so lange wartet, bis RDESKTOP beendet wurde und der RasPi erst danach herunterfährt?

  • Naja wie willst du unterscheiden ob die Trennung gewollt oder ungewollt war?


    Die Lösung von Nachtlog ist ziemlich dirty - aber laut deiner Beschreibung im ersten Post entspricht auch das nicht deinen Anforderungen, da du ja mit der STRG Taste eine eigene Auswahl treffen wolltest ob X11 gestartet werden soll oder nicht... Also versteh ich jetzt nicht was an der von dir gefundenen Lösung besser sein soll :huh:

  • Ich will eine einfache Möglichkeit haben anstatt dem RDP-Client das Betriebssystem zu starten um z.B. den voreingestellten Benutzernamen/IP zu ändern.
    Erster Gedanke war den RasPi beim Booten prüfen zu lassen, ob momentan Strg gehalten wird und dann den Aufruf des RDP-Clients zu überspringen.
    Alternative wäre es mit einem Jumper auf GPIO.
    Die Lösung mit dem abgezogenen Netzwerkkabel ist natürlich nicht so komfortabel wie mit Strg aber einfacher als mit dem Jumper.
    Wollte ein MasterImage für zukünftige RasPis erstellen und dann einfach nur den Benutzernamen und IP anpassen. Der Raspi soll aber automatisch mit dem RDP-Client starten und nach dem LogOff sofort herunterfahren ohne dass der Benutzer noch "viel" vom OS mitbekommt.

    Den RasPi würde ich hinter dem Bildschirm montieren. So kommt keiner "zufällig" an die Kabel.
    Unsere Nutzer sind stolz dass sie unter Windows nen Ordner anlegen können. So wird keiner von den "absichtlich" unter Linux fummeln wollen.
    Das System sollte so nutzerfreundlich sein wie es geht.
    In der Welt von Windows kann ich das ohne viel Aufwand mit .NET realisieren, nur hier in der Linux / Pythonwelt bin ich der NOOB :)

  • Naja dann wäre es aber denk ich einfacher einen Taster/Schalter über GPIO abzufragen, als eine gedrückte Taste.

    Ich würd also die dirty Lösung von Nachtlog so abändern das ein GPIO pin abfgefragt wird, an dem zB ein Kippschalter angeschlossen ist (damit man nicht die ganze Zeit einen Taster gedrückt halten muss). Solange der Schalter AN ist, dreht es sich im Kreis und führt nichts aus. Sobald der Schalter auf OFF ist wird rdesktop ausgeführt.

    Ggf. den globalen Autostart nutzen (ansonsten so vorgehen wie in der Anleitung vom Nachtlog):
    nano /etc/xdg/autostart/rdpclient.desktop && chmod +x /etc/xdg/autostart/rdpclient.desktop
    Achtung: Die Dateiendung muss .desktop lauten!

    Code
    [Desktop Entry]
    Type=Application
    Exec=/home/pi/startrdp.sh

    Script wie folgt erstellen: nano /home/pi/startrdp.sh && chmod +x /home/pi/startrdp.sh

    Den Schalter schließt du dann zwischen GPIO-17 und GND an.

    Solange dieser Schalter geschlossen ist, dreht sich die while Schleife im Kreis. Sobald der Schalter geöffnet, also keine Verbindung mehr zwischen GPIO-17 und GND besteht, wird die while Schleife beendet und der Befehl dadrunter ausgeführt.

    Da diese Lösung aber etwas CPU Last erzeugt würde ich dir lieber zu einem Python Script mit Interrupt raten, dann brauch man auch keine while Schleife mehr :)

  • Hallo meigrafd,
    erstmal vielen Dank für die sehr gute Erklärung :)

    Ich habe die Anleitung von Nachtlog befolgt.
    Das Script startet noch bevor der Desktop angezeigt wird.
    Sobald der gewünschte Server auf Ping reagiert, wird RDESKTOP ausgeführt.
    Nach dem Abmelden sieht man den Desktop vom RasPi.

    Mein Problem ist jetzt dass nach der Zeile "exec rdesktop $rdpIP -f -u $rdpUSERNAME -p $rdpPASSWORD" der Befehl "sudo shutdown" stehen muss.
    So wie ich das System verstehe, bewirkt EXEC dass der Befehl ausgeführt und sofort zum nächsten also in meinem Fall SUDO SHUTDOWN gesprungen wird. Der RasPi würde ja nach einigen Sekunden herunterfahren.

    Ich will aber, dass es erst dann passiert wenn RDESKTOP beendet wurde, also erst wenn der Benutzer sich vom Server abgemeldet hat.
    Wenn ich RDESKTOP ohne EXEC starte, springt das Script nach ca.30 Sekunden trotzdem in die nächste Zeile und fährt den RasPi herunter.

    Einmal editiert, zuletzt von insidERR (12. Dezember 2014 um 14:34)

  • Ja, ein bash Script, oder allgemein Scripts, werden von oben nach unten abgearbeitet.

    Ich würd dadrunter eine weitere Schleife setzen und einfach den Prozess beobachten. Wenn rdesktop ausgeführt wird müsste dieser Befehl ja in der Prozessliste ( ps aux ) auftauchen.. Den überwachst du dann einfach:

  • EDIT:
    Hmm...
    Irgendwas stimmt hier doch nicht.

    Dachte am FReitag es würde so laufen wie gewollt, tut es aber doch nicht :(

    Ich habe hier den ganzen Code aus der "startrdp.sh"


    Momentan verfolge ich die Lösungsmöglichkeit mit dem Ping, anstatt GPIO.

    Es läuft so:
    wenn der RasPi bei angeschlossenem LAN-KAbel hochfährt, wird sofort RDESKTOP gestartet.
    Nachdem man sich vom Server wieder abgemeldet hat, wird RDESKTOP beendet und man sieht den Desktop vom RasPi. Sonst passiert nix.
    Bei getrenntem LAN-Kabel startet der RasPi ohne RDESKTOP zu starten und man kann das Script anpassen.
    Sobald das LAN-Kabel wieder dran ist, startet der RDESKTOP. Nach dem Trennen passiert wieder nix.

    Wenn ich im Script das EXEC weg lasse, startet beim Booten RDESKTOP und nach ner knappen halben Minute fährt der RasPi trotz aktivem RDESKTOP einfach runter.

    Was läuft hier falsch?

    Einmal editiert, zuletzt von insidERR (15. Dezember 2014 um 09:30)

  • Dann probier es mal so:

Jetzt mitmachen!

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