ubuntuusers.de

Ein String per telnet und Schluss

Status: Gelöst | Ubuntu-Version: Server 18.04 (Bionic Beaver)
Antworten |

pascalts

Avatar von pascalts

Anmeldungsdatum:
6. Mai 2013

Beiträge: 89

Moin!

Ich möchte per bash / shell ein paar wenige Zeichen automatisiert an ein telnet-fähiges Gerät senden. Das Gerät hat keinerlei Authentifizierung (im Moment). Manuell würde ich so Vorgehen:

  1. Konsole auf und "telnet 192.168.178.35".

  2. Dann die "Escape-Taste"-Drücken um an den Telnet-Client ein "\x1b" zu senden.

  3. Es folgt mein eigentlicher Befehl, der nach folgendem Schema abläuft: "BB000000&", also 8 Buchstaben und/oder Ziffern und dann ein "&".

  4. Das Telnet-Gerät meldet irgend einen String zurück, z.B. "00001234&", davor aber unsichtbar ein "\x1b".

Ich möchte nun im ersten Schritt ein bash-Script erstellen, dass nichts anderes tut als "\x1bBB000000&" zu senden und die Telnet-Verbindung zu beenden. Später möchte ich die Antwort nach meinem Befehl noch auswerten, aber das ist jetzt noch nicht wichtig.

Ich hab schon mal geschaut, im manual vom telnet hab ich jetzt nichts direkt gefunden... Hat jemand eine Idee, wie ich das Umsetzen kann?

Hintergrund: Mein Pelletofen hat eine 5V TTL-Schnittstelle, ander über einen Pegelwandler ein ESP-01S dranhängt, der transparent eine UART<->telnet Bridge realisiert, damit ich auf die TTL-Schnitstelle des pelletofens zugreifen kann. Mit dem "proof of concept"-bash-script hier möchte ich später einfach den Ofen ein und ausschalten können.

Schonmal danke!

Bearbeitet von rklm:

Aufzählung. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Ich würde es mit https://docs.python.org/3/library/telnetlib.html probieren - damit hat man weniger Scherereien als mit der Shell und expect - das könnte für das von dir beschriebene Szenario z.B. so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env python3
from telnetlib import Telnet

HOST = "192.168.178.35"
PORT = 23

with Telnet(HOST, PORT) as tn:
    tn.write(b"\x1b")
    tn.write(b"BB000000&")
    match_idx, match_obj, bytes_read = tn.expect([b"&"], timeout=60) # wait up to 60 seconds for a response
    print(bytes_read)
    

pascalts

(Themenstarter)
Avatar von pascalts

Anmeldungsdatum:
6. Mai 2013

Beiträge: 89

Hm, ok. Danke erstmal.

Dann mal eine andere Frage: Normalerweise ist ja ^[ der Escape-Character, also \x1b. Aber ich werde hier im Terminal immer nach "^]" gefragt. Auf der deutschen Tastatur drücke ich dann ja "Strg" + "+". Aber was wäre das denn in Hexadezimal (also \x??)?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11269

Wohnort: München

Soweit ich weiß ist der Telnet-Escape Character \x1d

pascalts

(Themenstarter)
Avatar von pascalts

Anmeldungsdatum:
6. Mai 2013

Beiträge: 89

Okay danke. Leider bekomme ich mit der Python-Lösung eine falsche Antwort... Irgendetwas wird da falsch gesendet, werd mal schauen was.

Ich habe es tatsächlich mal in expect versucht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/expect
log_user 0
set timeout 2
spawn telnet 192.168.178.35
expect "aus.\r\n" { send "\x1bRD90005f&" }
log_user 1
expect "\x26" { send "\x1d" }
expect "telnet>" { send "quit" }
puts "\r"
close
exit

Das funktioniert soweit gut.

Das gibt sogar nur meine Antwort und \r aus.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

Ein help echo verrät die notwendigen Informationen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
help echo
echo: echo [-neE] [Argument ...]
    Ausgabe der Argumente auf die Standardausgabe.
    
    Zeigt die Argumente auf der Standardausgabe gefolgt von einem
    Zeilenumbruch an.
    
    Optionen:
      -n	Keinen Zeilenumbruch anfügen
      -e	Interpretation der folgenden Escape-Sequenzen zulassen
    
    »echo« interpretiert die folgenden Escape-Sequenzen:
      \e	Escape-Zeichen
      \E        Escape Zeichen
      \0nnn	Zeichen mit dem ASCII-Code »NNN« (oktal). »NNN« kann null
    		bis drei oktale Ziffern haben.
      \xHH	Acht-Bit-Zeichen mit dem Wert »HH« (hexadezimal). »HH«
    		kann ein oder zwei hexadezimale Ziffern haben.

Hier auf die entscheidenden Punkte gekürzt. Für das Escapezeichen gibt es einen eigenen Code, \x1b oder \x1d kannst Du ja auch versuchen, falls es nicht klappt. Jedenfalls brauchst Du bei echo so oder so den Schalter -e, um diese Escapesequenzen zu benutzen.

1
echo -ne "\x1b\x1d\e" > hexatest 

Verrät mir, in Kombination mit dem Viewer des mc im Hexmode, dass 0x1b für das Escapezeichen steht. Man kann auch od benutzen, aber mich da durch die Optionen zu arbeiten überfordert mich am Wochenende. ☺

Antworten |