Home Assistant Python Script mit Telnet

Moin, ich bin neu in der Hausautomation und Versuche mich hier langsam einzuarbeiten.

Mein Vorhaben ist folgendes:
Ich möchte ein phthon Script erstellen das eine telnet Verbindung zu meinem selbstgebauten Mähroboter aufbaut.
Dann sollen Daten empfangen werden, darauf soll wieder ein Befehl gesendet werden.
Das Script sieht wie folgt aus:

#!/usr/bin/python3
import telnetlib
import time
HOST = "192.168.178.90"
PORT = "8881"
telnet = telnetlib.Telnet(HOST, PORT)
telnet.write(b"{@}/n")
telnet.read_until(b"}",3)
telnet.write(b"exit\n")
telnet.close()

Dies ist natürlich nur ein kleines Testscript. Allerdings gibt es Probleme mit dem Import.

Da mir hier einfach das wissen fehlt, Frage ich hier einmal nach, vielleicht ist es ja nur eine Kleinigkeit?

grundsätzlich wie hier beschrieben

Ich hab bisher nur ein “set.state” script und das funktioniert genau so wie es da beschrieben wurde, also eintrag in der configuration.yaml, Ordner stellen und script reinwerfen.

Das gibt aber nix zurück, aber in der Anleitung ist ja ein Beispiel für “returning data”

Das Script wird ja auch ausgeführt, soweit funktioniert es ja, allerdings kann ich die telnetlib nicht includieren. Da liegt der Fehler, denke ich. Gibt es da Abhilfe/alternativen?

Moin,

Bin kein Programmierer und kenne Deine Anforderungen nicht, aber ich würde nirgends mehr Telnet einsetzen, viel zu unsicher, wenn dann ssh

Kenne Deine Python Umgebung, nicht, ist denn die Lib auch installiert, denn wie gesagt Telnet unsicher, wenn man das braucht, muss man das sicherlich nachinstallieren.

VG
Bernd

In der PY Umgebung in HA ist die LIB nicht implementiert. :frowning: Daher klappt es nicht. Wie nutze ich ssh? Ist das kompatibel zueinander?
Wie gesagt: ich möchte Daten senden, empfangen und darauf reagieren können.

Moin,

Wie schon gesagt, ich bin kein Programmierer, ob das Beispiel von Google - Gemeni sinnvoll ist, kann ich nicht sagen :man_shrugging:

import paramiko

DEVICE_IP = "192.168.178.90"
USERNAME = input("Username: ")
PASSWORD = getpass.getpass("Password: ")

try:
  ssh = paramiko.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect(DEVICE_IP, 22, username=USERNAME, password=PASSWORD)

  # Befehl ausführen und Ausgabe auslesen
  stdin, stdout, stderr = ssh.exec_command("Befehl auf dem Gerät ausführen")
  print(stdout.read().decode('ascii'))

  # Optionale Dateiübertragung
  sftp = ssh.open_sftp()
  sftp.put("local_file.txt", "remote_file.txt")
  sftp.close()

  ssh.close()
  print("Verbindung erfolgreich beendet.")

except paramiko.SSHException as e:
  print(f"SSH-Fehler: {e}")

VG
Bernd

P.S.: wenn nicht mit User/Passwort, sondern SSL genutzt werden soll, dann

Um SSH mit einem SSL-Zertifikat anstelle eines Passworts zu verwenden, müssen Sie folgende Schritte ausführen:

1. Auf dem Gerät:

  • Generieren Sie ein SSH-Schlüsselpaar:
    • RSA-Schlüsselpaar:
      ssh-keygen -t rsa
      
    • Ed25519-Schlüsselpaar (empfohlen):
      ssh-keygen -t ed25519
      
  • Kopieren Sie den öffentlichen Schlüssel (id_rsa.pub oder id_ed25519.pub) auf den Client.
    • Sie können den Schlüssel manuell kopieren oder scp verwenden:
      scp ~/.ssh/id_rsa.pub user@device_ip:~/.ssh/authorized_keys
      
  • Fügen Sie den öffentlichen Schlüssel zur authorized_keys-Datei auf dem Gerät hinzu.
    • Stellen Sie sicher, dass die Datei authorized_keys die Berechtigungen 600 hat.
  • Deaktivieren Sie die Passwortbasierte Authentifizierung (optional):
    • Bearbeiten Sie die Datei /etc/ssh/sshd_config auf dem Gerät und setzen Sie PasswordAuthentication auf no.

2. Auf dem Client:

  • Speichern Sie das private Zertifikat (id_rsa oder id_ed25519).
    • Vermeiden Sie die Speicherung des privaten Schlüssels im Klartext.
    • Erwägen Sie die Verwendung eines Passwort-Managers oder eines Hardware-Tokens zur Speicherung des Schlüssels.
  • Verwenden Sie die IdentityFile-Option in der SSH-Konfiguration.
    • Fügen Sie in Ihrer SSH-Konfigurationsdatei (z.B. ~/.ssh/config) die folgende Zeile hinzu:
      IdentityFile ~/.ssh/id_rsa # or ~/.ssh/id_ed25519
      

3. Anmelden mit SSH:

  • Sie sollten sich jetzt ohne Passwort mit SSH anmelden können:
    ssh user@device_ip
    

Zusätzliche Hinweise:

  • Stellen Sie sicher, dass Sie die richtige SSH-Version auf dem Gerät und dem Client verwenden.
  • Ältere Versionen von SSH unterstützen möglicherweise keine neueren Schlüsselformate wie Ed25519.
  • Wenn Sie Probleme mit der Verbindung haben, überprüfen Sie die SSH-Protokolldateien auf dem Gerät und dem Client auf Fehlermeldungen.

Vorteile der Verwendung von SSL-Zertifikaten für SSH:

  • Erhöhte Sicherheit: SSL-Zertifikate bieten eine stärkere Authentifizierung als Passwörter und sind weniger anfällig für Brute-Force-Angriffe.
  • Bequemlichkeit: Sie müssen sich keine Passwörter mehr merken oder eingeben.
  • Automatisierung: SSH-Schlüssel können in Skripten und automatisierten Prozessen verwendet werden.

Weitere Informationen:

1 „Gefällt mir“

Ich lese mich mal rein. Allerdings gibt es keine Passwortabfrage, aber das sollte ja irgendwie machbar sein. Ich Versuche es erstmal mit PuTTY auf dem windoof Rechner.

Nachtrag:
Ich kann via SSH nicht auf das Gerät zugreifen. Wird nicht unterstützt.
Weiß niemand eine Lösung?
Ich kann einen Telnet-Schalter anlegen, da fehlt mir jedoch die Möglichkeit auf die empfangene Daten zu reagieren.

:pencil2: by tarag: Beiträge zusammengeführt. Bitte bearbeiten Funktion nutzen.