Befehle von CCU an Raspi & Co schicken

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
Benutzeravatar
Roland M.
Beiträge: 9736
Registriert: 08.12.2012, 15:53
System: CCU
Wohnort: Graz, Österreich
Hat sich bedankt: 251 Mal
Danksagung erhalten: 1356 Mal

Befehle von CCU an Raspi & Co schicken

Beitrag von Roland M. » 12.06.2021, 01:13

Hallo!

Immer wieder kommt man in die Situation, dass die CCU einen Befehl an ein Linux/Unix-Gerät schicken soll.
Etwa SMS über einen Raspi mit gammu versenden, 3D-Drucker fernbedienen, Steuerungen aller Art ansprechen, etc. Ich möchte beispielsweise auch per Homematic ein Internetradio steuern; Sender wechseln, Playlisten auswählen, Streams starten und stoppen funktioniert über die REST-API, ausschalten kann man das Gerät aber darüber nicht. Dafür muss man sich lokal anmelden und den Shutdown durchführen.

Warum eigentlich? Es gibt doch SSH!

In meiner weiteren Beschreibung gehe ich davon aus, dass ich als Zielgerät einen Raspberry namens "raspi" habe, mit (Standard-) Benutzer "pi" und Passwort "asdf1234" (ja, ja, jeder Admin verdreht dabei die Augen, ist ja auch nur ein Beispiel! ;) ).

Mit SSH kann man sich von Unix- zu Unix-Maschine anmelden, wenn die Benutzernamen unterschiedlich sind (CCU "Admin" - Raspi "pi"), gibt man den richtigen gleich mit an. Also
ssh pi@raspi
eingeben und schon kommt man auf das gewünschte System.

Gibt man nur den oben genannten Befehl ein, kommt man in die Shell und kann normal arbeiten, allerdings kann man auch statt in die Shell zu gelangen gleich einen Befehl senden.
Wenn man beim obigen Beispiel bleibt und den Raspi herunterfahren will, macht man das mit dem Befehl
sudo shutdown -h

Vom externen Rechner aus also kombiniert
ssh pi@raspi sudo shutdown -h

Gewonnen, oder?
Nicht ganz, denn da ist noch dieses dumme Passwort!
Und ssh will immer die Passworteingabe, also nichts für eine Automation.

Also denkt sich der kleine Maxi, einfach das Passwort mitschicken:
echo "asdf1234" | ssh pi@raspi sudo shutdown -h
Fehlanzeige!
ssh besteht auf die Eingabe des Passwortes!

Bewegt man sich auf üblichen Linux-Distributionen gibt es ein nachladbares Programmpaket namens sshpass, das genau das macht:
sshpass -p "asdf1234" ssh pi@raspi sudo shutdown -h
Schon hätte man gewonnen, wenn man auf der Busybox der CCU Pakete nachladen könnte...

Also bleibt nur der Weg über die etwas aufwändigere, dafür aber absolut saubere Lösung, nämlich der Austausch eines passwortfreien Schlüssels zwischen den Geräten! Auch die risikobehaftete Speicherung des Passwortes in Klartext wird dadurch vermieden.

Folgende Schritte sind dafür notwendig (von mir auf CCU2 und Raspberrymatic getestet):

1.
Per SSH auf der CCU anmelden und Schreibschutz vom Dateisystem aufheben
mount -o remount,rw /

2.
MIt
ssh-keygen
einen neuen Schlüssel, genauer gesagt ein Schlüsselpaar (privat und öffentlich) erzeugen.
Das sieht etwa so aus:

Code: Alles auswählen

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
#
Hier bei der Eingabe sowohl den Speicherort durch Drücken der Return-Taste übernehmen, als auch das Passwort leer lassen!

Dieser Schlüssel kann anschließend auf mehreren Geräten genutzt werden.

3.
Da keine weiteren Änderungen auf der CCU mehr notwendig sind, kann der Schreibschutz wieder gesetzt werden
mount -o rewrite,ro /

4.
Der öffentliche Teil des zuvor erstellten Schlüssels kann nun auf das Zielgerät übertragen werden
ssh-copy-id pi@raspi

Dabei ein letztes Mal das Passwort eingeben. :)

Code: Alles auswählen

# ssh-copy-id pi@raspi
pi@raspi's password: 
#
5.
Ab jetzt wird beim ssh-Aufruf der hinterlegte Schlüssel verwendet, der kein Passwort beinhaltet.

6.
Nun kann die CCU über den system.Exec()-Befehl oder über CUxD-Exec Befehle ausführen, z.B. in einem Script

Code: Alles auswählen

string out;
system.Exec("ssh pi@raspi sudo shutdown -h", &out);
Fertig, Ziel erreicht! :)


Roland
Zur leichteren Hilfestellung bitte unbedingt beachten:
  • Bezeichnung (HM-... bzw. HmIP-...) der betroffenen Geräte angeben (nicht Artikelnummer)
  • Kurzbeschreibung des Soll-Zustandes (Was soll erreicht werden?)
  • Kurzbeschreibung des Ist-Zustandes (Was funktioniert nicht?)
  • Fehlermeldungen genau abschreiben, besser noch...
  • Screenshots von Programmen, Geräteeinstellungen und Fehlermeldungen (direkt als jpg/png) einstellen!

-----------------------------------------------------------------------
1. CCU2 mit ~100 Geräten (in Umstellung auf RaspberryMatic-OVA auf Proxmox-Server)
2. CCU2 per VPN mit ~50 Geräten (geplant: RaspberryMatic auf Charly)
3. CCU2 per VPN mit ~40 Geräten (geplant: RaspberryMatic auf CCU3)
CCU1, Test-CCU2, Raspi 1 mit kleinem Funkmodul, RaspberryMatic als VM unter Proxmox, Access Point,...

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“