"Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Hoggle
Beiträge: 221
Registriert: 16. Dez 2017 10:49
Answers: 0

"Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von Hoggle »

Hallo und Entschuldigung für die lange Überschrift, aber so denke ich, sollte jeder wissen, was ich vorhabe.
Ich habe mein Openhab auf einem RPI4 mit SSD am laufen und das 7"-Touchscreen-Display mit einem 2. RPI (3b) zur Darstellung von einigen Infos.
Das habe ich seit gestern so, das ich damit leben kann und auch der WAF ist passend.
Jetzt ist es aber so, dass das Display keinen Stromsparmodus hat und dementsprechend immer an ist. Ich kann nur einen schwarzen Bildschirmschoner aktivieren.
Jetzt habe ich in einer Schublade noch eine schaltbare Steckdose von Z-Wave gefunden.
Damit könnte ich mir eine einfache Rule erstellen, um den RPI Zeitgesteuert anzuschalten, aber wie fahre ich den RPI automatisch herunter?
Kann man das irgendwie mit dem exec-Binding realisieren?
Mein Openhab-RPI hat die IP10.1.1.42 und der Display-RPI hat die IP 10.1.1.83 und ist per ping erreichbar. Per ssh kann ich mich mit einem Benutzer und dem Passwort vom RPI4 am RPI3b anmelden (Benutzer:hoggle, PW:elggoh4321).

Wie kann ich den RPI3b jetzt per Rule herunter fahren? Ach ja, der RPI ist per WLAN im Netz und es wäre cool, wenn ich vor dem herunterfahren prüfen könnte, ob der RPI3b überhaupt erreichbar ist.
Da ich bis auf das absetzen einiger kleiner Befehle (ifconfig, reboot, shutdown, ls, ping und ssh) keine großen Erfahrungen mit Linux habe, müsste man mir dabei ein wenig helfen (Besonders das Thema Benutzerrechte ist für mich als Windows-Nutzer schwierig bis garnicht nachzuvollziehen)
Der RPI3b hat das aktuelle raspian bulseye vom 1.11.2022(Installationsdatum)
Ein einfaches absetzen von den Befehlen ssh, shutdown 0 geht ja nicht.
Das Passwort muß ja auch eingegeben werden und beim ersten Mal, wenn ich einen Befehl mit sudo eingebe, muß ich das Passwort auch noch einmal eingeben auf dem RPI3b.
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von udo1toni »

Es gibt verschiedene Möglichkeiten, das umzusetzen.
Per exec geht und ist einigermaßen straight forward :)
Auf dem openHAB Pi legst Du ein bash Script an, welches den eigentlichen Befehl sendet. Der notwendige Befehl wäre poweroff, allerdings muss der Befehl mit erweiterten Rechten auf dem Display Pi ausgeführt werden. Du brauchst also auf dem Display Pi am besten einen User, der diesen Befehl über sudo ausführen darf, und zwar am besten ohne ein Passwort eingeben zu müssen. Da openHAB die Steuerung ist, wäre es naheliegend, den User openhab zu nennen :)

Also Schritt 1: User openhab auf dem Display Raspberry anlegen:

Code: Alles auswählen

sudo adduser -p openhab
Dies legt den User openhab an, allerdings hat dieser User kein Passwort, somit kann man sich am Prompt nicht als openhab anmelden.
Schritt 2: Der User braucht ein remote login ohne Passswort, das geht über ein Schlüsselpaar. Am Besten erzeugt man das direkt unter dem User selbst (wir erinnern uns: der User kann sich eigentlich nicht anmelden). Das geht so:

Code: Alles auswählen

sudo su - openhab
Das sudo sorgt dafür, dass wir als User root den Befehl su ausführen, womit wir uns als beliebiger User anmelden können. Das - wechselt in das zugehörige home-Verzeichnis, zuletzt folgt der Name des Kontos.
Als User openhab erzeugen wir nun ein ordinäres Schlüsselpaar:

Code: Alles auswählen

ssh-keygen -f openhabid_rsa
Bei der Frage nach dem Passwort einfach <enter> drücken, denn der Schlüssel darf nicht passwortgeschützt sein.
Anschließend gibt es zwei Dateien, openhabid_rsa und openhabid_rsa.pub.
Letztere Datei kopieren wir:

Code: Alles auswählen

cp openhabid_rsa.pub .ssh/authorized_keys
Erstere kopieren wir auf den openHAB Host:

Code: Alles auswählen

scp openhabid_rsa openhabian@openhabianpi:~/
Das Passwort ist das, mit dem Du Dich auch per PuTTY auf dem openHAB System anmeldest. openhabianpi kann auch die IP des openHAB Host sein :)


Wenn das soweit geklappt hat, kannst Du vom openHAB Host aus mal probieren, ob Du Dich als User openhab anmelden kannst:

Code: Alles auswählen

ssh openhab@displaypi -i ~/openhabid_rsa
hier musst Du natürlich als User openhabian angemeldet sein, da dieser momentan den privat key bei sich liegen hat. displaypi ist natürlich die IP des Display Pi.
Klappt das soweit, kannst Du die erzeugten Dateien auf dem Display Pi löschen:

Code: Alles auswählen

rm ~/openhabid_rsa*
und Dich aus dem User ausloggen Nun musst Du dem User openhab auf dem Display Pi noch erlauben, den Befehl poweroff ohne Eingabe eines Passworts mittels sudo auszuführen:

Code: Alles auswählen

sudo visudo
ruft die betreffende Datei zum bearbeiten auf.
Innerhalb der Datei sollte es eine Zeile dieser Form geben:

Code: Alles auswählen

root    ALL=(ALL:ALL) ALL
Unter diese Zeile fügst Du eine neue Zeile hinzu:
openhab ALL=(ALL:ALL) NOPASSWD: /sbin/poweroff
und speicherst die Datei.
Anschließend sollte der Befehl poweroff auch remote funktionieren, ohne Eingabe eines Passworts, also auf dem openHAB Host:

Code: Alles auswählen

ssh openhab@displaypi -i ~/openhabid_rsa sudo poweroff
Wenn es soweit funktioniert, bist Du schon auf der Zielgeraden, Du musst nur noch diesen Befehl über executeCommandline() auslösen. Das Exec Binding brauchst Du dazu nicht, denn Du willst den Befehl ja nur aus einer Rule heraus ausführen können, nicht unmittelbar über die UI.

EDIT: Die Zielgerade... Ich hatte gestern leider keine Zeit mehr, mein Posting zum Ende zu führen...
Deshalb noch ein paar weitere Schritte.
Die Datei openhabid_rsa muss natürlich in ein passendes Verzeichnis verschoben werden, damit der User openhab (auf dem openHAB Host System) die Datei überhaupt nutzen kann. Dazu müssen wir zunächst ein Verzeichnis anlegen:

Code: Alles auswählen

sudo -u openhab mkdir ~/.ssh
Dann können wir die Datei verschieben:

Code: Alles auswählen

sudo mv ~/openhabid_rsa $OPENHAB_HOME/.ssh
und anschließend noch die Rechte passend ändern:

Code: Alles auswählen

sudo chown openhab: $OPENHAB_HOME/.ssh/openhabid_rsa
sudo chmod 600 $OPENHAB_HOME/.ssh/openhabid_rsa
sudo -u openhab ls -l ~/.ssh
Der letzte Befehl sollte nur eine Datei ausspucken, eben openhabid_rsa, als Besitzer sollte openhab:openhab eingetragen sein und die Rechte sollten -rw------ sein (nur der Besitzer darf lesen und schreiben)

Ein kurzer Test der Verbindung ist wichtig, denn das System muss noch eine Datei known_hosts für den User openhab anlegen:

Code: Alles auswählen

sudo -u openhab ssh displaypi -i openhabid_rsa ls -la
Wir führen also als User openhab den Befehl ssh aus. Da wir an dieser Stelle schon User openhab sind, müssen wir den Usernamen nicht bei der Verbindung angeben. Da der private Key im Verzeichnis .ssh liegt, welches als Standardsuchpfad in ssh definiert ist, müssen wir auch das Verzeichnis nicht mit angeben. Wir wollen den Display Pi nicht runterfahren, sondern nur sehen, dass die Verbindung klappt, deshalb ein harmloses ls -la um ein Lebenszeichen zu erhaschen.

ssh sollte fragen, ob der Verbindung zu displaypi mit dem Fingerprint vertraut wird. Wird das bestätigt, erzeugt ssh die erwähnte Datei known_hosts im Verzeichnis ~/.ssh/. Damit sind die Arbeiten im Betriebssystem abgeschlossen (man könnte allerdings noch ein Bash Script anlegen, welches den eigentlichen Befehl enthält und dann in openHAB nur dieses Script aufrufen).

In openHAB kannst Du nun innerhalb einer Rule den Befehl ausführen lassen:

Code: Alles auswählen

executeComandline("/usr/bin/ssh","displaypi","-i","openhabid_rsa","sudo", "poweroff")
Man sollte bei executeCommandline() immer den absoluten Pfad zum Programm mit angeben :) alle Leerzeichen werden durch "," ersetzt, so dass also lauter Strings ohne Leerzeichen als Parameter übergeben werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Hoggle
Beiträge: 221
Registriert: 16. Dez 2017 10:49
Answers: 0

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von Hoggle »

Ohne Worte.

Wollte eigentlich nur schauen, ob mir jemand einen Tipp gegeben hat und erhalte ein komplette howto.
Ich werde es heute Nachmittag (Nach getaner Hausarbeit :cry: :roll: ) sofort testen und eine Rückmeldung geben.

Immer wieder unglaublich, was man mit den Systemen alles so anstellen kann, wenn man es nur weiß.

Danke, danke, danke.
RPI4/8GB RAM mit openhabian (bullseye) - Kernel Linux 6.1.21-v8+ - openhab 4.0.2 - Release Build - HM-CCU3 - ZWave UZB-USB Stick - Wifi-LED-Stripes - Logitech Harmony Hub - AVM Fritzbox - Enigma2-Box - Gardena HUB - Fronius-Binding - Miele@Home

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von udo1toni »

UPDATE: In der Zwischenzeit gab es ein paar Updates verschiedener Pakete für GNU/Linux, deshalb ein kurzes Update...
Die notwendigen Schritte (alles nach # incl. sind Kommentare und sollen nicht mit eingegeben werden)

Die Systeme "heißen" displaypi (das Remote System) und openhabianpi (das openHAB System).

Auf dem Remote System:

Code: Alles auswählen

sudo adduser --disabled-password openhab     # User für die Fernsteuerung anlegen, darf sich nicht mit Passwort anmelden
sudo su - openhab                            # Trick, um sich dennoch als User openhab anzumelden :)
mkdir .ssh                                   # Verzeichnis für ssh anlegen...
chmod 700 .ssh                               # nur User openhab darf hier etwas tun
ssh-keygen -f openhabid_rsa                  # Erzeuge Schlüsselpaar (KEIN Passowrt, bei der Frage einfach <Enter> drücken)
mv openhabid_rsa.pub .ssh/authorized_keys    # Verschiebe den öffentlichen Schlüssel in das passende Verzeichnis
chmod 640 .ssh/authorized_keys               # Falls die Dateirechte noch nicht stimmen sollten
scp openhabid_rsa openhabian@openhabianpi:~/ # kopiere den Private Key auf das openHAB System (ins home-Verzeichnis von openhabian)
rm openhabid_rsa                             # lösche den Private Key auf dem Remote System; er wird hier nicht mehr gebraucht
exit                                         # als User openhab abmelden
sudo visudo                                  # Datei editieren, in der Berechtigungen definiert werden
in der nun geöffneten Datei folgende Zeile suchen:

Code: Alles auswählen

root    ALL=(ALL:ALL) ALL
und darunter folgende Zeile einfügen:

Code: Alles auswählen

openhab ALL=(ALL:ALL) NOPASSWD: /sbin/poweroff
Datei speichern und Editor verlassen.


Auf dem openHAB System, als User openhabian angemeldet:

Code: Alles auswählen

ssh openhab@displaypi -i ~/openhabid_rsa
Damit sollte man eine Secure Shell auf dem Remote System öffnen. Funktioniert das, mit exit wieder abmelden.
Damit:

Code: Alles auswählen

ssh openhab@displaypi -i ~/openhabid_rsa sudo poweroff
sollte das Remote System nun herunterfahren.

Vorbereitungen, damit openHAB den Schlüssel verwenden kann:

Code: Alles auswählen

sudo -u openhab mkdir ~/.ssh                             # Verzeichnis für ssh anlegen
sudo chmod 755 $OPENHAB_USERDATA                         # Rechte für home-Verzeichnis von User openhab korrekt setzen
sudo chmod 700 $OPENHAB_USERDATA/.ssh                    # Rechte für .ssh korrekt setzen
sudo mv ~/openhabid_rsa $OPENHAB_USERDATA/.ssh           # Private key ins Verzeichnis schieben
sudo chown openhab: $OPENHAB_USERDATA/.ssh/openhabid_rsa # Besitz ändern
sudo chmod 600 $OPENHAB_USERDATA/.ssh/openhabid_rsa      # Rechte anpassen
sudo -u openhab ls -l ~/.ssh                             # prüfen, dass die Datei korrekt im richtigen Verzeichnis liegt
sudo -u openhab ssh displaypi -i openhabid_rsa ls -la    # Funktionert der Zugriff als User openhab?
Befehl in einer openHAB Rule:

Code: Alles auswählen

executeComandline("/usr/bin/ssh","displaypi","-i","openhabid_rsa","sudo", "poweroff")
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von filmgucker2 »

...da ist ja die Anleitung :D

In der ersten Zeile ist aber wohl ein kleiner Typo drin: Es müsste heißen: sudo adduser --disabled-password.
Die wirklichen Probleme beginnen für mich, wie schon im Nachbarstring genannt mit dem scp Befehl:
Mein OpenhabPi heißt: openhabian@openhabian.

Code: Alles auswählen

scp openhabid_rsa openhabian@openhabian ~/
cp: 'openhabid_rsa' und '/home/openhabssh/openhabid_rsa' sind dieselbe Datei
cp: der Aufruf von stat f�r 'openhabian@openhabian' ist nicht m�glich: Datei oder Verzeichnis nicht gefunden
Wie kriege ich die Schlüsseldatei auf meinen openhabian? Filezilla lässt mich in dem Verzeichnis von openhabssh(so heißt
mein user auf dem FremdPi) auch nichts tun. Keine Berechtigung. Und "known hosts" sind openhabian und FremdPi natürlich
auch noch nicht...

...aber klar: Ich muss nur von der shell des openhabian den FremdPi über ssh anrufen. Dann lernen sie sich kennen. Und trotzdem
dann kriege ich wieder die letzte Meldung s.o. Und außerdem ist das Verzeichnis mit den authorized keys versteckt...Der vorher
erstellte und zu openhabian zu kopierende key damit auch...
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von udo1toni »

filmgucker2 hat geschrieben: 18. Sep 2023 15:14 In der ersten Zeile ist aber wohl ein kleiner Typo drin: Es müsste heißen: sudo adduser --disabled-password.
Jepp, ich hab's oben korrigiert.
filmgucker2 hat geschrieben: 18. Sep 2023 15:14 Die wirklichen Probleme beginnen für mich, wie schon im Nachbarstring genannt mit dem scp Befehl
Oh, noch ein Typo... da fehlt noch ein Doppelpunkt...

Code: Alles auswählen

scp openhabid_rsa openhabian@openhabian:~/
Auc hdas korrigiere ich oben...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von filmgucker2 »

Es hat wieder geklappt. Nur warum, weiß ich nicht. Es scheint wieder ein Kampf des tatsächlich Berechtigten (der andere Pi gehört mir :D ) , also ich, mit den Rechten zu sein...Ich kann ihn also über einen openhab Befehl herunterfahren.
Aber ich habe noch einen anderen Pi...mit dem ich das Gleiche und noch mehr machen möchte:
Also, gerade "warmgelaufen" habe ich die Tour wiederholt. Nutzer auf FremdPi angelegt. Keys generiert. Auch das Kopieren
auf meinen Openhab-Host funktionierte.
Die Anleitung enthielt einen weiteren kleinen Typo: executeComandline muss executeCommandLine heißen. Aber das war schnell erkannt.
Das Problem zeigte sich bei dem Befehl: sudo -u openhab ssh displaypi -i openhabid_rsa ls -la, abgewandelt für meine Dateien.
Das ließ er mich nicht tun. Ich erinnerte mich an einen früheren Thread mit gleichem Problem: Ich wollte mein NAS remote ausschalten: viewtopic.php?p=50613&hilit=NAS#p50613
Es klappte schließlich, und ich wusste nicht warum. Die Key Datei rsa war und ist im openhab Verzeichnis /usr/share/openhab/.ssh (schön versteckt :D ).

Code: Alles auswählen

 sudo -u openhab ssh openhab@zuganzeige -i openhabZug_rsa ls -la
Warning: Identity file openhabZug_rsa not accessible: No such file or directory.
Die Datei openhabZug_rsa als Schlüssel liegt im o.a. Verzeichnis, hat auch die Rechte, die Du angabst...
Raspberry Pi 4, OH 4.0.3

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von filmgucker2 »

... und ich war mit sudo su - -s /bin/bash openhab eingeloggt.
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15241
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von udo1toni »

Warum erzeugst Du für jeden Rechner einen eigenen Key? (Also, klar, kannst Du machen, und unter bestimmten Umständen ist das sogar zu empfehlen, aber wenn das alles Rechner bei Dir sind, die noch dazu Dir gehören, wäre es das einfachste, die Datei authorized_keays von dem einen Remote Rechner auf den anderen Remote Rechner zu kopieren. Wichtig ist nur, dass der User, mit dem Du Dich anzumelden versuchst, auf dem Zielsystem vorhanden ist und in "seiner" authorized_keys Datei den passenden Public Key zum verwendeten Private Key beinhalten.

Gehört die Datei openhabZug_rsa auch dem User openhab?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: "Display-RPI" per exec-Befehl runter fahren und mit Schaltsteckdose anschalten

Beitrag von filmgucker2 »

Ja, gehört openhab:openhab. Aber an das Kopieren der Keys hab ich noch gar nicht gedacht. Hoffentlich lässt mich der erste RemotePi das tun...und die authorized Keys verstecken sich auch noch...
Raspberry Pi 4, OH 4.0.3

Antworten