Mit fhem Systembefehle auf entfernten Rechnern ausführen

Hier wird beschrieben wie man mit Fhem auf entferntern Rechnern, also nicht lokal, Befehle per SSH-Protokoll ausführen kann. Dies wird beispielhaft anhand des Herunterfahrens(Shutdown) eines Rechners beschrieben. Auf dem herunterzufahrenden Rechner läuft ArchLinux, die Anleitung ist aber auch mit kleinen Änderungen für andere Linuxdistributionen geeignet.

Das größte Problem sind die Passwortabfragen die beim Absetzen des SSH-Komandos erfolgen. Dies ist zum einen das Passwort für den Benutzer mit dem der Befehl auf dem entfernten Rechner ausgeführt werden soll, sowie das Passwort falls des Befehl mit Rootrechten ausgeführt werden muss. Für das erste Problem gibt es die Lösung mit Public-Keys, für das zweite wird die Datei “sudoers” angepasst, so dass die Befehle ohne Passwort ausgeführt werden können. Dies wird im weiteren beschrieben.




 


Entfernter Rechner: Benutzer anlegen

Als erstes loggt man sich auf dem entfernten Rechner über das SSH Protokoll mit einem bekannten Nutzer ein und erstellt einen Benutzer der nur fürs Herunterfahren zuständig ist.

Benutzer anlegen:

sudo useradd -m -g users -s /bin/bash poweroff

Passwort für den Benutzer vergeben:

sudo passwd poweroff



 


Entfernter Rechner: Befehle festlegen die ohne Rootrechte ausgeführt werden sollen

Normalerweise ist das Herunterfahren und Neustarten des Rechner nur mit Rootrechten möglich. Um auch einen Benutzer ohne Rootrechte dies zu ermöglichen muss die Datei “sudoers” angepasst werden. Dazu gehen wir folgendermmaßen vor:

sudo visudo

Nun mit den Pfeiltasten bis zum Ende der Datei navigieren, einmal “a” drücken um in den Schreibmodus zu wechseln und dort folgendes einfügen:

poweroff ALL=NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

Hinweis: Diese müssen bei anderen Systemen oder Befehlen angepasst werden. Es sind die Befehle die ohne Rootrechte ausgeführt werden können. Hier bitte genauso vorgehen wie beschrieben, da bei falscheingaben leicht Fehler entstehen können. Um Visudo zu beenden ohne die Änderungen abzuspeichern, einmal „ESC“ drücken, dann die Eingabe „:q!“ machen und mit “Enter” bestätigen.

Dies sollte dann wie im unteren Bild aussehen:

visudo Befehle ohne Passwort

Zum Beenden müssen wir wieder in den Befehlsmodus wechseln. Dazu drücken wir einmal die „ESC“ Taste, dann speichern wir die Datei (:w!) und anschließend beenden wir Visudo (:q). Die Befehle bestätigen wir jeweils mit “Enter”. Hier nochmal die Eingaben die gemacht werden müssen:

:w!
:q



 


Lokaler Rechner: Mit dem Benutzer fhem einloggen

Um die Passwortabfrage beim Herstellen der SSH-Verbindung zu umgehen, nutzen wir eine Authentifizierung über Public-Keys. Dazu müssen wir das Schlüsselpaar für den Benutzer unter dem Fhem läuft anlegen. Das ist standardmäßig der Benutzer fhem. Daher loggen wir uns mit einem anderen Nutzer auf den Rechner auf dem fhem läuft ein und vergeben ein Passwort für den Nutzer fhem.

sudo passwd fhem

Anschließend müssen wir dem Benutzer fhem eine Shell zuweisen. Dazu öffnen wir folgende Datei:

sudo nano /etc/passwd

Dort ändern wir den Eintrag beim user fhem von “…/bin/false” in “…/bin/bash”. Das sollte dann anschließend wie unten im unteren Bild aussehen.

Shell bin-bash

Anschließend starten wir den Rechner neu und loggen uns mit dem Benutzer fhem ein.




 


Lokaler Rechner: Public-Keys erzeugen

Nun generieren wir das Schlüsselpaar über dem die Authentifizierung laufen soll. Dazu geben wir folgendem Befehl ein:

ssh-keygen -t rsa -b 4096

Dies dauert eine Zeit und dann gibt es eine Abfrage nach dem Speicherort [2]. Die bestätigen wir mit “enter”.

Public-Key erstellen und Speicherort der Keys

Anschließend wird noch nach einer Passphrase und deren Bestätigung gefragt die wir auch mit “enter” bestätigen. Dies ist der entscheidende Punkt, damit später kein Passwort beim Herstellen einer SSH-Verbindung benötigt wird. Hinweis: Auf die Schlüssel sollte man gut acht geben, da jedem der die Schlüssel in die Hände bekommt, diese für eine passwortlose Verbindung nutzen kann.

Passphrase eingeben



 

Ist der Schlüssel nun generiert, dies sieht man anhand einer Meldung, so kann er dann mittels “ssh-copy-id” [1]auf dem entfernten Rechner deponiert werden Hinweis: Der Ordnername muss evtl. angepasst werden wenn er nicht dem Standard Home-Verzeichnis von Fhem entspricht. Ob dies der Fall ist sieht man bei der vorherigen Abfrage des Speicherorts bzw. im oberen Bild “…/opt/fhem…”.

ssh-copy-id -i /opt/fhem/.ssh/id_rsa.pub poweroff@ip-des-entfernten-Rechners

Nach dem Ausführen des Befehls muss die Abfrage noch mit “yes” bestätigt werden [2].

SSH-Schlüssel auf eintfernten Rechner kopieren

Nun muss noch das Passwort für den Benutzer “poweroff” eingegeben werden. Dies entfällt nach dem deponieren des Schlüssels.

Passwort für SSH-Verbindung eingeben

Wenn dies erfolgreich war, dann bekommt man bestätigt das der Schlüssel deponiert wurde.

Erfolgsmeldung des kopiervorgangs



 


Lokaler Rechner: Passwortlose SSH-Verbindung prüfen

Da der Schlüssel nun deponiert wurde, wird jetzt geprüft ob eine SSH-Verbindung ohne Passwort mit dem Benutzer “poweroff” möglich ist. Dazu gibt man folgendes ein [2]:

ssh 'poweroff@192.168.1.25'

Am Eintrag [3] “[poweroff@alarm…]” kann man erkennen das man mit dem anderen Rechner verbunden ist und wie man sieht kein Passwort mehr benötigt wird. Mit “exit” wird die Verbindung wieder beendet.

exit
Testen der SSh-Verbindung ohne Passwort



 


Lokaler Rechner: Systembefehl mit Fhem absetzen

Nun muss noch der Befehl über Fhem abgesetzt werden. Dazu kann man ein WOL-Modul nutzen(Wake-On-Lan) mit dem man auch den Rechner, wenn er es unterstützt, über die LAN-Schnittstelle aufwecken kann. Es ist zwar das Wake-On-Lan konfiguriert, dies ist aber nicht notwendig. Hinweis:Es werden im Beispiel zwei Rechner heruntergefahren. Dem “@” Zeichen muss mit einem “\”  vorangestellt werden (escapen) damit die IP-Adresse richtig gelesen wird. Es wird evtl. das Programm “etherwake” benötigt, dies kann über die Paketverwaltung nachinstalliert werden(sudo apt-get update und dann sudo apt-get etherwake). 

Beispielhaft habe ich folgendes in die fhem.cfg eingetragen:

define WOL_Shutdown WOL 00:1e:06:cc:bd:8e 192.168.1.25 EW 5
attr WOL_Shutdown shutdownCmd { system("ssh poweroff\@192.168.1.25 sudo systemctl poweroff") };;{ system("ssh root\@192.168.1.34 poweroff") };;{Log 1, "Shutdown: alarm" }
attr WOL_Shutdown sysCmd /usr/sbin/etherwake



 

Das sollte dann so aussehen:

Definition WOL-Shutdown Command

In der Fhem Oberfläche sieht das ganze dann wie folgt aus:

WOL Shutdown Modul

Klickt man hier auf “off” so wird das vorher definierte “shutdownCmd” ausgeführt.

Ist es erfolgreich, so bekommt man nur die selbst erstellte Meldung “Shutdown: alarm”

Shutdown Wake-On-Lan Modul erfolgreich

Ist es nicht erfolgreich, weil z.B. der Rechner nicht läuft sieht es so aus:

Shutdown Wake-On-Lan nicht erfolgreich

Hinweis: Wird der Befehl aus anderen Gründen nicht richtig ausgeführt so sieht man das in der fhem-logdatei.

Dies war hier schon alles, ich hoffe das die Anleitung hilfreich war. Bei Fragen und Anmerkungen könnt ihr gerne einen Kommentar hinterlassen.




 

3 Antworten

  1. Rene sagt:

    Hi,
    toller Artikel, klappt das auch, wenn FHEM im Docker Container läuft?

  2. adrian sagt:

    Hi, nachdem ich dem User fhem nun die Rechte erteilt habe, auch lesend udn schreibend auf das Verzeichnis .ssh zuzugreifen, habe ich es noch einmal versucht den publickey zu erzeugen, ebenso auf den Zielrechner zu kopieren.
    das hat nun alles wunderbar funktioniert. auch die Anmeldung aus dem fhem mit dem fhem user auf dem remote-pi mit dem “poweroff” user klappt. allerdings werde ich in putty bei der anmeldung mit dem poweroff user und dem absetzen des Befehls “poweroff” nach einem passwort gefragt.
    das wollte ich ja vermeiden. gibts da noch einen trick bzgl. der visudo datei und den einträgen?
    danke udn Gruß
    adrian

  3. adrian sagt:

    Hallo,
    eine sehr ausführliche Anweisung. ich hab mich genau daran gehalten, dennoch erhalte ich Fehler.
    wenn ich mit dem “fhem”-user den Befehl “ssh-keygen -t rsa -b 4096” ausführe, kommt “Could not create directory ‘/opt/fhem/.ssh’: Permission denied”
    nun habe ich den Ordner “.ssh” unter “/opt/fhem/” und die Datei “id_rsa” händisch angelegt, erhalte aber nun einen weiteren Fehler “key_save_private: Permission denied”
    Der Versuch “ssh-keygen -t rsa -b 4096” mit vorangestelltem “sudo” auszuführen funktioniert zwar, aber der copy Befehl benötigt anschließend auch wieder ein vorangestelltes “sudo”.
    Die Verbindung mit “ssh ‘poweroff@192.168.x.x'” startet vielversprechend, wirft aber den Fehler “Failed to add the host to the list of known hosts (/opt/fhem/.ssh/known_hosts).”
    Auch die Verbindung muß ich mit “sudo” starten. ich hab vorsichtshalber die datei “known_hosts” auch einmal händisch angelegt.

    muß ich den “fhem”-User mehr Rechte geben, dass ich auf das sudo verzichten kann?

    danke und gruß
    adrian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert