FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: tpunkt am 16 September 2021, 21:21:15

Titel: Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 16 September 2021, 21:21:15
Hallo,

ich möchte gerne fhem (läuft auf einem raspberry) von meinem (Windows) Laptop aus über keystrokes steuern. Dazu hatte ich auch schon mal ein funktionierendes System aus .bat Dateien, die über von .vbs Dateien aktiviert wurden. Diese .bat Dateien sehen so aus

@echo off
wget -q -O NUL "https://admin:passwort@192.168.178.211:8083/fhem?cmd=set Drucker on"


Seit ich meinen raspberry samt fhem neu aufsetzen musste funktioniert das leider nicht mehr, finde aber den Grund nicht. Hat jemand von Euch eine Idee was da schief laufen könnte? Oder vielleicht einen anderen Vorschlag, wie ich Befehle über meine Windows Tastatur an fhem senden könnte?

Danke!
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: andies am 16 September 2021, 21:38:03
was ist denn, wenn du die befehle in den browser eingibst?
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Jamo am 16 September 2021, 21:53:04
1) Hast Du evtl in deiner fhem WEB instanz 'allowfrom' gesetzt, und die IP von deinem Laptop ist nicht mit drin?
2) csrf token gesetzt / nicht gesetzt, dann muss es unten in die URL mit rein, also https://admin:passwort@192.168.178.211:8083/fhem?cmd=set Drucker on&fwcsrf=abcdefghij&XHR=1
3) meiner Meinung nach muessen die Leerzeichen mit %20 encodiert werden, also:https://admin:passwort@192.168.178.211:8083/fhem?cmd=set%20Drucker%20on&fwcsrf=abcdefghij&XHR=1
4) Ich bin mir nicht sicher, ob das "admin:passwort" Konstrukt in https://admin:passwort@192.168.178.211.... noch akzeptiert wird, ich meine da hat es mal eine Änderung bei den Browsern gegeben, evtl geht auch nur noch http://192.168.xxx.xxx/fhem?user=xxx&pass=yyy.
Deswegen würde ich in fhem erstmal eine WebInstanz definieren, die kein user:passwort definiert hat, und dann ohne user und passwort probieren also https://192.168.178.211:8083/fhem?cmd=set%20Drucker%20on&fwcsrf=abscdefg&XHR=1
5) stimmt die IP adresse?
6) https ?

Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 16 September 2021, 23:04:01
Hi,

ich hätte nach ein Powershell Script zu bieten: https://github.com/heinz-otto/fhemcl/blob/master/fhemcl.ps1

Gruß Otto
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: betateilchen am 17 September 2021, 10:06:44
kennt Windows inzwischen nicht mal mehr telnet? (ich weiß es wirklich nicht.)

Aber selbst wenn: putty ist zumindest in ssh Batch-fähig, damit kann man eine Verbindung zum FHEM Server aufbauen und dann dort auf jeden Fall telnet Befehle (komplexe Dinge sogar aus einer Datei) absetzen.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 10:57:56
telnet muss man nachinstallieren.
ssh ist direkt vorhanden, putty braucht man dafür nicht.

Man kann damit recht simpel eine ssh Verbindung aufbauen und ein shell Script auf dem FHEM Server ausführen.
Lediglich das Tool ssh-copy-id fehlt unter Windows um den public key Zugang exakt so einrichten zu können wie unter Linux üblich.
Dafür hätte ich auch eine Beschreibung (https://heinz-otto.blogspot.com/2021/01/befehle-und-scripts-per-ssh-ausfuhren.html). ;)

Gruß Otto
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 12:11:27
Zitat von: andies am 16 September 2021, 21:38:03
was ist denn, wenn du die befehle in den browser eingibst?

Dann funktionieren sie
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 12:14:58
Zitat von: tpunkt am 17 September 2021, 12:11:27
Dann funktionieren sie
Weil der Browser den csrf token ordentlich behandelt. Siehe: https://wiki.fhem.de/wiki/CsrfToken-HowTo
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 12:19:13
Zitat von: Jamo am 16 September 2021, 21:53:04
1) Hast Du evtl in deiner fhem WEB instanz 'allowfrom' gesetzt, und die IP von deinem Laptop ist nicht mit drin?
2) csrf token gesetzt / nicht gesetzt, dann muss es unten in die URL mit rein, also https://admin:passwort@192.168.178.211:8083/fhem?cmd=set Drucker on&fwcsrf=abcdefghij&XHR=1
3) meiner Meinung nach muessen die Leerzeichen mit %20 encodiert werden, also:https://admin:passwort@192.168.178.211:8083/fhem?cmd=set%20Drucker%20on&fwcsrf=abcdefghij&XHR=1
4) Ich bin mir nicht sicher, ob das "admin:passwort" Konstrukt in https://admin:passwort@192.168.178.211.... noch akzeptiert wird, ich meine da hat es mal eine Änderung bei den Browsern gegeben, evtl geht auch nur noch http://192.168.xxx.xxx/fhem?user=xxx&pass=yyy.
Deswegen würde ich in fhem erstmal eine WebInstanz definieren, die kein user:passwort definiert hat, und dann ohne user und passwort probieren also https://192.168.178.211:8083/fhem?cmd=set%20Drucker%20on&fwcsrf=abscdefg&XHR=1
5) stimmt die IP adresse?
6) https ?

Wie oben gerade geschrieben funktionieren die Befehle bei direkter Eingabe im Browser, leider aber trotz der folgenden Änderungen immer noch nicht mit der .bat Datei.

1) 'allowfrom' ist nicht gesetzt
2) csrf probeweise entfernt
3) es funktioniert ohne %20 bei Direkteingabe über den Browser
4) Das "admin:passwort" Konstrukt habe ich in das vorgeschlagene Format geändert und der Befehl funktioniert bei Direkteingabe über den Browser, aber leider immer noch nicht über die .bat Datei. Leider bin ich davon abgesehen damit überfordert eine WebInstanz zu definieren...
5) Die IP adresse stimmt
6) https ist richtig so
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 12:20:28
Zitat von: Otto123 am 17 September 2021, 12:14:58
Weil der Browser den csrf token ordentlich behandelt. Siehe: https://wiki.fhem.de/wiki/CsrfToken-HowTo

Ich versuche jetzt mal telnet zu definieren
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 12:28:32
Zitat von: tpunkt am 17 September 2021, 12:19:13
Leider bin ich davon abgesehen damit überfordert eine WebInstanz zu definieren...
Und einfach mal den Weg über das Powershellscript magst Du nicht probieren? https://github.com/heinz-otto/fhemcl
Falls dir die Beschreibung dort zu knapp oder zu umfangreich ist :)
# windowstaste + x -> Windows Powershell öffnen
# Einmalig Script herunterladen
wget -OutFile fhemcl.ps1 https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.ps1
# Deine Befehle einfach so absetzen
.\fhemcl.ps1 "https://admin:passwort@192.168.178.211:8083" "set Drucker on"

Falls die Ausführung von PS Scripts noch nicht aktiviert wurde - vorher:
# windowstaste + x -> Windows Powershell (Administrator) öffnen
set-ExecutionPolicy RemoteSigned
# Mit Ja bestätigen
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 14:14:44
Danke Otto für die Anleitung. Es klappt leider immer noch nicht, aber ich schreibe mal auf, was ich genau gemacht habe:

1. wget -OutFile fhemcl.ps1 https://raw.githubusercontent.com/heinz-otto/fhemcl/master/fhemcl.ps1 auf meinem Windows-Laptop in der Powershell ausgeführt im Standardordner C:\Windows\system32
2. set-ExecutionPolicy in der Windows Powershell (Administrator) ausgeführt und bestätigt
3. den Befehl .\fhemcl.ps1 "https://admin:passwort@192.168.178.211:8083" "set Drucker on" in eine .bat Datei gepackt und ausgeführt

Edit: Habe den Schritt 1. für den Ordner wiederholt, wo die .bat Datei gespeichert ist und nach dem Ausführen dieser öffnet sich jetzt ein cmd-Fenster mit der Meldung C:\Users\xxxxx\xxxxx\xxxxx\scripts>.\fhemcl.ps1 "https://pi:password@192.168.178.211:8083" "set Drucker on"

und ein Textfenster mit dem Code der Datei fhemcl.ps1
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 14:38:36
Hast Du denn wenigsten einmal den Befehl so ausgeführt wie ich vorgeschlagen habe? Also in der Powershellkonsole?  ::)
Wenn Du das ganze in einem batch Script ausführen willst musst Du folgendes beachten:
Den Pfad für das Script und den Aktuellen Pfad, also verwende für den Aufruf am einfachsten den kompletten Pfad.
Beispiel: C:\Users\xxxxx\xxxxx\xxxxx\scripts\fhemcl.ps1

Das Script braucht die Powershell, also musst Du das Script auch mit der Powershell aufrufen:
powershell C:\Users\xxxxx\xxxxx\xxxxx\scripts\fhemcl.ps1 'https://admin:passwort@192.168.178.211:8083' 'set Drucker on'
Du musst beachten nur einfache Hochkommas zu verwenden, aus irgendwelchen Gründen funktionieren die doppelten bei diesem Aufruf in der cmd nicht.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 15:01:44
ZitatHast Du denn wenigsten einmal den Befehl so ausgeführt wie ich vorgeschlagen habe?
Das war mir nicht klar.

ZitatWenn Du das ganze in einem batch Script ausführen willst musst Du folgendes beachten:
Den Pfad für das Script und den Aktuellen Pfad, also verwende für den Aufruf am einfachsten den kompletten Pfad Beispiel C:\Users\xxxxx\xxxxx\xxxxx\scripts\fhemcl.ps1

Das Script braucht die Powershell, also musst Du das Script auch mit der Powershell aufrufen:
powershell C:\Users\xxxxx\xxxxx\xxxxx\scripts\fhemcl.ps1 'https://admin:passwort@192.168.178.211:8083' 'set Drucker on'
Du musst beachten nur einfache Hochkommas zu verwenden, aus irgendwelchen Gründen funktionieren die doppelten in der cmd nicht.

Habe ich so ausprobiert, bekomme jetzt die Fehlermeldung: Invoke-WebRequest: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden. Muss ich dann etwas an der powershell ändern?
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: laberlaib am 17 September 2021, 15:17:14
Ich will jetzt nicht verwirren, will nur hierauf kurz eingehen:

Zitat von: tpunkt am 17 September 2021, 12:19:13
4) Das "admin:passwort" Konstrukt habe ich in das vorgeschlagene Format geändert und der Befehl funktioniert bei Direkteingabe über den Browser, aber leider immer noch nicht über die .bat Datei. Leider bin ich davon abgesehen damit überfordert eine WebInstanz zu definieren...

Die einfachste aller WebIstanzen müsste eigentlich das hier sein:
define WEBapi FHEMWEB 8088 global
attr WEBapi csrfToken none

Läuft dann über Port 8088, keine Einschränkung nach IP (allowedfrom), kein csrfToken und kein https.


Edit für die Nachwelt:
Die Instanz hat dann keinerlei Schutz. Das ist zum Testen von Verbindungen, Skripten o.ä. ganz nützlich. Nach und nach kann (und sollte) man dann die Schutzmaßnahmen (BasicAuth, SSL, allowed from, ...)hochziehen.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 15:21:45
Naja - irgendwas ist ja immer  ::) vielleicht findest Du hier (https://www.google.com/search?q=Invoke-WebRequest%3A+Es+konnte+kein+gesch%C3%BCtzter+SSL%2FTLS-Kanal+erstellt+eigenes+zertifikat) Lösungsansätze.

Wenn das zu nichts führt und Du alternative Wege gehen musst, noch zwei Hinweise:
- mit telnet würdest Du unverschlüsselt arbeiten, es sei denn Du richtest Telent auch mit ssl ein. Wobei ich nicht weiß, ob der Telnet Client von Windows das kann.
- mit ssh würdest Du verschlüsselt arbeiten, quasi lokal am FHEM Server die Befehle absetzen und viele Stolperfallen umgehen.

Oder der Empfehlung von laberlaib folgen, falls der FHEM Rechner nicht "komplett im Internet steht"
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 17 September 2021, 16:51:17
Zitat von: laberlaib am 17 September 2021, 15:17:14
Läuft dann über Port 8088, keine Einschränkung nach IP (allowedfrom), kein csrfToken und kein https.

Das funktioniert jetzt! Was wäre dann jetzt die Schlussfolgerung was nun das Grundproblem bei mir ist?

Leider werde ich aus den Artikeln, die Otto netterweise verlinkt hat nicht schlau. Net framework ist up to date. Habe die Lösungsvorschläge hier versucht https://stackoverflow.com/questions/41618766/powershell-invoke-webrequest-fails-with-ssl-tls-secure-channel (https://stackoverflow.com/questions/41618766/powershell-invoke-webrequest-fails-with-ssl-tls-secure-channel) leider ohne Erfolg. Hat jemand vielleicht noch einen Tip, was ich noch versuchen könnte?
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 17 September 2021, 18:48:38
Warscheinlich sind die Möglichkeiten woran das liegt vielfältig, ich habe da jetzt ne Weile rumprobiert, dass einzige zuverlässige Ergebnis hier die SSL-Prüfung abschalten (Langform):
https://www.msxfaq.de/code/powershell/powershell_und_zertifikate_check.htm
Ist aber - naja ...

Das muss aber in der gleichen powershell session passieren! Also einmal powershell auf und zwei Scripte ausführen. Weiß auf die Schnelle nicht, wie man das in einer Befehlszeile macht.

Es hält fit, aber zur Nachahmung und späteren Wartung kann man das alles nicht empfehlen.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: laberlaib am 18 September 2021, 10:32:49
Zitat von: Otto123 am 17 September 2021, 15:21:45
Oder der Empfehlung von laberlaib folgen, falls der FHEM Rechner nicht "komplett im Internet steht"

Ich hab oben mal einen Edit dazu gefügt.
Empfehlung würde ich es nicht nennen. Aber wenn man schauen will, an welcher Stelle es den scheitert bei einer Verbindung von extern via Skripten, Apps oä. ist es manchmal ganz nützlich, mit so etwas zu beginnen und dann nach und nach die Sicherheitsmaßnahmen hochzuziehen und zu schauen, wann es scheitert.
Und für so curl-artige Apps (Android: "HTTP Shortcuts" ist da meine Empfehlung) ist der CSRF-Token oftmal ein Hindernis. Daher habe ich für diese solche eine, wie im Wiki und Forum oftmals beschriebene, ApiInstanz ohne Token aber mit BasicAuth laufen.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 18 September 2021, 10:39:38
Guten Morgen,

weiter probiert: Es muss an Deiner SSL Konfiguration liegen!
Wenn ich ein ordentliches gültiges Zertifikat beim HTTPS Server hinterlege, dieses Zertikat als Vertrauenswürdige Stammzertifizierungsstelle im Lokalen Computer importiert wurde und der Browser (bei mir Chrome) mit dem Schloss anzeigt das die SSL Verbindung gültig ist, wird auch in der Powershell Konsole alles ordentlich abgearbeitet!
Wichtig ist dabei vor allem, dass die Alternativen Namen im Zertifikat mit der verwendeten URL übereinstimmen! Beispiel:
Zitat"subjectAltName=DNS:raspib.lan,IP:192.168.56.80"
Damit funktioniert die URL https://raspib.lan:8084 und https://192.168.56.80:8084
Von der Namensauflösung her funktioniert auch die URL https://raspib:8084 - aber hier ist das Zertifikat ungültig: sowohl im Browser und es kommen auch Fehler in der Powershellkonsole.

Gruß Otto
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: laberlaib am 18 September 2021, 14:57:46
Aber im Zweifelsfall mal realistisch betrachtet:
SSL ist für diese Verbindung auch nicht zwingend notwendig - bitte um Korrektur, wenn ich hier total falsch liege:
Annahme ist, dass "FHEMWEB" und "allowed" richtig funktionieren. Wenn nicht, dann sind auch weitere Überlegungen sinnfrei.
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: tpunkt am 19 September 2021, 15:45:48
Interessant, vielleicht lasse ich es dann wirklich so.

Ich werde trotzdem mal dieser Anleitung (https://wiki.fhem.de/wiki/FHEM_mit_HTTPS_SSL-Zertifikat_und_eine_eigene_Zertifizierungsstelle#Dein_Anliegen (https://wiki.fhem.de/wiki/FHEM_mit_HTTPS_SSL-Zertifikat_und_eine_eigene_Zertifizierungsstelle#Dein_Anliegen)) folgen und gucken, dass ssl richtig implementiert ist.

Danke für die Anregungen!
Titel: Antw:Befehle an fhem vom Laptop aus senden
Beitrag von: Otto123 am 19 September 2021, 17:33:40
Für einen Server und ein Zertifikat ist das Verfahren vom Wiki schon wieder ziemlich umfangreich. Eigentlich reicht es ein neues Zertifikat per Kommandozeile zu erstellen und diese Zertifikat auch im PC zu importieren.
Bei mehreren Servern sollte man die eigene CA erstellen, aber mit Doku damit man in einem Jahr noch weiß was man getan hat ;)

Edit: Mit der Befehlszeile ensteht im aktuellen Pfad ein Zertifikat mit den entsprechenden Einträgen. Ich bin nicht sicher, ob das in jeder Umgebung funktioniert.
openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -extensions san -config \
   <(echo "[req]";
    echo distinguished_name=req;
    echo "[san]";
    array=($(host $(hostname)|grep 'has address'));
    echo subjectAltName=DNS:localhost,DNS:$(hostname|tr -d '\n'),DNS:${array[0]},IP:${array[3]}
    ) \
  -subj "/CN=example.com"

Mit der Zeile kann man sich den Inhalt anzeigen lassen und schauen ob die Namenseinnträge stimmig sind.
openssl x509 -in example.crt -text -noout