telnet oder curl - wie fhem-Kommandos via Shell starten

Begonnen von olwaldi, 29 Dezember 2023, 11:05:30

Vorheriges Thema - Nächstes Thema

olwaldi

Bislang nutze ich die telnet-Schnittstelle von fhem, um via nc von der Shell aus fhem-Kommandos absetzen zu können:
telnetport=7072
fhemhost=localhost
function FhemRun()
{
    echo "$*" | nc -w1 "${fhemhost}" "${telnetport}"
}
Benausogut könnte ich mein neues FHEMWEB Device WEBapi via curl nutzen:
apiport=8088
fhemhost=localhost
function FhemRun()
{
    curl --silent \
--data-urlencode "cmd=$*" \
--data-urlencode "XHR=1" \
--data-urlencode "fwcsrf=csrf_4711" \
"http://${fhemhost}:${apiport}/fhem"
}
Funktionieren tut beides, wobei die curl-Lösung etwas langsamer zu laufen scheint.

telnet-Nutzung ist ja aus Sicherheitsgründen etwas verpönt (daher ja ssh). Aber spielt das hier eine Rolle?


Grüßle, Michael

Otto123

Hallo Michael,

wenn Du telnet nicht global definierst und den Zugriff auf die ip beschränkst, was sollte da passieren?
Ja, die HTTP Schnittstelle ist etwas langsamer. Und extra "API WEB" ist auch bloß ein zusätzliches "Loch", wenn Du HTTP willst nimm mein fhemcl.sh Script ;) - das ist aus meiner Sicht rund.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

olwaldi

Letzendlich will ich versuchen, mein fhem möglichst "sicher" zu machen. Da aber mein lokales Netz eh' von außen nicht erreichbar ist, sollte es eigentlich keine Risiken geben.

Ich scheitere aber schon daran, wie ich die Paßworte (die z.B. email oder Shelly benötigen) ablegen soll. Klar, ich könnte die in fhem ähnlich zu https://forum.fhem.de/index.php?topic=107071.0 speichern. Aber da fhem die Paßworte ja braucht, kann fhem die auch natürlich wieder 'rausgeben - prinzipbedingt.

Deine Lösung auf Basis von wget hatte ich schon gefunden - erschien mir aber insbesondere im Vergleich zur Telnet-Lösung recht aufwendig.

Auch ein Wechsel von HTTP zu HTTPS bringt m.E. nicht viel, wenn man die Paßworte via sudo aus den jeweiligen Dateien eh' leicht auslesen kann - ganz ohne aufwendigeres Mitschneiden vom HTTP-Datenverkehr.

Vermutlich bleibe ich dann doch beim telnet - dann aber auch global (sprich' erreichbar für alle Rechner im lokalen Netz).


Grüßle, Michael

Otto123

Zitat von: olwaldi am 29 Dezember 2023, 16:24:53Deine Lösung auf Basis von wget hatte ich schon gefunden - erschien mir aber insbesondere im Vergleich zur Telnet-Lösung recht aufwendig.
Ich verstehe den Gedanken mit dem Aufwand nicht, es ist EIN Script, keine Installation notwendig außer wget wird mW nichts benötigt. Du nimmst es so wie es ist. Es bedient die WEB Schnittstelle so wie sie ist, es ist von jedem Linux oder Windows System nutzbar.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

olwaldi

Da hast Du schon Recht, wäre aber ein Skript mehr. Aktuell nutze ich schon (lange) ein Skript von mir, das Kommandos an meinen Denon-Receiver weiterreicht - wahlweise seit heute per telnet oder curl (ursprünglich nur telnet). Dein Skript müßte ich entweder per cut&paste (tut man nicht:-) einbauen oder eben als zusätzliches Skript bereitstellen. Ist aber letztendlich einfach Geschmackssache:-)

Grüßle, Michael

Otto123

Sieh das mit dem Script doch wie "ein Befehl" mehr nicht. Das liegt als Datei irgendwo, wo Du es aufrufen kannst und fertig. Drei Zeilen zum setup :)
Du machst jetzt einen Aufwand mit curl (nicht in allen Systemen per default installiert) und machst Dir Gedanken über die Aufruf Parameter. Mein Script verwendest Du wie nc oder fhem.pl oder ...
Wenn Du es in z.B. /usr/local/bin ablegst und ausführbar machst, wird es wie jeder andere Befehl gefunden. Viele linux Befehle sind einfache Shellscripte.

ZitatDa aber mein lokales Netz eh' von außen nicht erreichbar ist, sollte es eigentlich keine Risiken geben.
Das ist ein Trugschluss, denn Du bist u.U. das Problem. cross site scripting (dafür ist der csrf_token) passiert in Deinem Browser. Du infizierst unwissentlich einen Deiner Computer mit einem Virus und der findet alle offenen Stellen in deinem Netzwerk usw.
Das einer im LAN zu Hause Netzwerkverkehr mitschneidet ist mMn unwahrscheinlich, ich meine: SSL im LAN zu Hause ist entbehrlich, Einschränkung auf IP Adressen und Verwendung von Passwörtern nicht.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

olwaldi

Zitat von: Otto123 am 29 Dezember 2023, 18:40:57Sieh das mit dem Script doch wie "ein Befehl" mehr nicht. Das liegt als Datei irgendwo, wo Du es aufrufen kannst und fertig. Drei Zeilen zum setup :)
Stimmt schon (selbst pure-ftp ist eine Python-Skriptfamilie und kein klassisches Programm). Das "Loch" mit FHEMWEB WEBapi brauche ich für den ShellyPlug, ist aber mit festem csrf abgesichert (immerhin). Daher ja meine Idee, die telnet-Schnittstelle wegzunehmen, um die Anzahl der Löcher zu reduzieren. Bin aber wieder zurück bei telnet, da ich die Lautstärke-Regelung vom AVR via fhem/nc mache. Und da merkt man den Geschwindigkeitsvorteil von telnet tatsächlich.

Aber schonmal gut, daß auch Deiner Meinung nach HTTPS lokal nicht zwingend erforderlich ist. Dann bleibe ich bei HTTP, solange google chrome mich läßt:-)


Guten Rutsch, Michael