Erzwingen Sie, dass telnet / ssh crtl-H als Rücktaste verwendet

9

Ich habe einige Geräte an einen Cisco Serial Term Server angeschlossen. Viele funktionieren einwandfrei, wenn ich telnetdirekt an den Port des Cisco gehe. Ich habe jedoch einige hartnäckige Geräte, die nicht verwendet werden, Backspaceda sie standardmäßig in Telnet zugeordnet sind.

Für den Fall, dass es wichtig ist, telnet ich rxvtunter Debian Squeeze (in einem X-Fenster). TERMgesetzt ist rxvt, aber es spielt keine Rolle , ob ich verwenden vt100, vt101oder xterm... Wechsel TERMhat keine Wirkung. Ich begann den Weg des Wandels TERMbasierend auf dem, was ich in einer alten Kermit-FAQ gesehen habe . FWIW stty erase ^hund stty erase ^?auch nicht.

Ich habe festgestellt, dass dies Backspaceauf diesen Geräten ordnungsgemäß funktioniert, wenn ich einen unformatierten TCP-Socket von netcat... ie nc 192.168.12.117 2006; Dann stoße ich jedoch auf andere Probleme mit nicht versteckten Passwörtern oder Terminal-Paging.

Wie kann ich zwingen selektiv Telnet und SSH zu kartieren , Backspaceum CtrlHfür diese Geräte? Nach welchen Kriterien sollte ich auch bewerten, ob dies ein Fehler im Gerät ist?

BEARBEITEN

Falls es darauf ankommt, ist dies die Ausgabe von showkey -afür die fraglichen Schlüssel ... ^?entspricht Backspaceund ^Hist CtrlH. Es scheint, als sollte ich näher kommen, wenn ich mir das Linux-Tastatur- und Konsolen-Howto anschaue , aber ich kann anscheinend nicht entschlüsseln, was ich tun kann, um dies zu ändern. Ich habe verschiedene Beschwörungsformeln loadkeysohne Wirkung ausprobiert .

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^H        8 0010 0x08

Ich beziehe auch relevante Ausgaben von ein dumpkeys... Dies ist die aktuelle Zuordnung in meinem System (die auf einigen fraglichen Geräten nicht funktioniert). Wenn ich herausfinden könnte, wie Backspaceich das Gleiche tun kann CtrlH, hätte ich eine Lösung.

[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =
[mpenning@hotcoffee docs]$
Mike Pennington
quelle
1
Hast du es versucht ssty erase '^?'? Wenn die Geräte auf einem bestehen C-h, handelt es sich nicht um einen Telnet-Anruf, sondern um das Terminal (Emulator).
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ihr Kommentar ist eigentlich nicht korrekt, siehe meine Antwort unten
Mike Pennington

Antworten:

10

Ich habe endlich eine Antwort in Anne Barettas Linux Keyboard Hall of Shame gefunden ... es scheint, dass das Ändern von Tastenzuordnungen in xterm/ rxvtnicht gut isttelnet .

Ich habe dies überprüft, als ich an der Telnet-Verbindung gerochen habe. Zuerst habe ich an der Telnet-Sitzung gerochen und gesehen, dass diese an den Host Backspacegesendet wurde 0x7f. Als nächstes habe ich absichtlich Backspaceauf die rxvtVerwendung verzichtet stty erase $(wodurch meine Rücktaste der Dollar-Anmeldung zugeordnet wurde rxvt). Danach musste ich die Rücktaste $drücken rxvt, wurde aber telnettrotzdem gesendet, 0x7fwenn ich sie Backspaceauf dem Remote-Host verwendete.

LÖSUNG

Erstellen Sie ein Skript mit dem Namen kbdfix(unten) und machen Sie es mit 755Berechtigungen ausführbar . Sie benötigen die tclshund expectPakete, die aus Ihren Distributionsarchiven geladen wurden.

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

Um nun eine Verbindung zu den defekten Hosts herzustellen, tippe ich kbdfix telnet 192.168.12.117 2006und Backspacearbeite.

Hinweis für alle, die bis 2006 verwirrt waren ... Dies ist der TCP-Port, den der Cisco Term Server für die serielle Verbindung zur Konsole des defekten Geräts verwendet (in diesem Fall ein Brocade FCX-Switch).

Wenn Sie lediglich ein Telnetting an ein Gerät durchführen, das BackspaceIhnen nicht gefällt , würden Sie es verwenden kbdfix telnet <addr_of_the_broken_device>. Ich verwende dies auch mit ssh, wenn ich ssh zu einem DLink DGS-3200-Ethernet-Switch mit ähnlichen Problemen verwende. Die Syntax lautet kbdfix ssh 172.16.1.26.

Mike Pennington
quelle
2
stty erase $ordnet die "Rücktaste" nicht "$" zu, sondern teilt dem tty-Treiber mit, dass zum Löschen eines Zeichens die Taste "$" verwendet werden muss. Wenn Sie Telnet ausführen, befinden Sie sich im Raw-Modus, sodass diese Einstellung ignoriert wird. Eine einfache Lösung wäre, Ihren Terminalemulator so zu konfigurieren, dass er ^ H für die Rücktaste sendet, wie von Gott beabsichtigt. Ein anderer verwendet Ihren Hack, der diese Zeichen im laufenden Betrieb mit "Expect" übersetzt.
Jlliagre
@jlliagre, ja, ich habe festgestellt, dass sttysich die telnetTastaturlesungen bei der Verwendung nicht geändert haben wireshark. Diese wichtige Tatsache war mir jedoch erst klar, als ich schnüffelte. Ich werde untersuchen , wie kann ich Rück ändern verwenden Control_hin rxvt... oder vielleicht muss ich über die Suche nach anderen Begriff denken.
Mike Pennington
@ Mike: Ich denke, Sie sind immer noch verwirrt über etwas (was ich weder zugeben noch explizit erwähnt habe; ich habe meine Antwort aktualisiert). sttymuss auf der Anwendungsseite ausgeführt werden. Ich bezweifle sehr, telnetdass Sie Eingabezeichen übersetzen oder dass Sie diese verwenden müssen script. Nur sttyauf dem Remote-Computer zu laufen, wird wahrscheinlich den Trick tun.
Gilles 'SO - hör auf böse zu sein'
@ Gilles, der Remote-Computer ist ein Netzwerkgerät, das er nicht hat stty.
Mike Pennington
1
@Mike: Wenn Sie netcat verwenden, befindet sich Ihr Terminal im gekochten Modus: Sie schreiben eine Zeile, bearbeiten sie lokal und Entersenden sie. Wenn Sie Telnet verwenden, befindet sich Ihr Terminal im Raw-Modus: Jedes Zeichen wird sofort an die Anwendung gesendet. Siehe zB den Anfang dieser Seite oder diesen Wikipedia-Artikel .
Gilles 'SO - hör auf böse zu sein'
3

Rücktaste und Control-H wurden so konzipiert, dass sie dasselbe sind, aber heutzutage, insbesondere unter Linux, wird häufig die Rücktaste gesendet, um zu löschen, und es wird eine ungerade Escape-Sequenz gesendet.

In jedem Fall und soweit ich weiß, sollten Telnet oder die TERM-Variable nicht ändern, was die Rücktaste sendet. Dies ist normalerweise eine Konfigurationsfunktion für Terminalemulatoren.

jlliagre
quelle
Ihre Frage basiert auf der Annahme, dass Telnet den Backspace-Schlüssel spezifisch verarbeitet, was meiner Meinung nach falsch ist. Ich hätte das als Kommentar anstatt als Antwort setzen sollen.
Jlliagre
AFAICT telnetachtet nicht auf lokale Terminalzuordnungen der Tastatur. Anne Barretas Notizen über Tastatur und Telnet
Mike Pennington
Ich fürchte, Sie verstehen falsch, was stty tut.
Jlliagre
3

Programme sollen die Terminaleinstellungen abfragen, um herauszufinden, was das Rücktastezeichen ist ( ^hund ^?dh \010und \177, sind die beiden Auswahlmöglichkeiten da draußen). Verwenden Sie stty erase '^h'oder, um stty erase '^?'zu deklarieren, was Ihr Terminal sendet.

Wenn Sie sich remote (mit Telnet, rsh oder ssh) im Terminal anmelden, müssen Sie stty auf der Anwendungsseite ausgeführt werden . sttyDas Terminal wird nicht angewiesen, etwas anderes zu tun. Es informiert den lokalen Terminaltreiber (dh den Teil, der mit Anwendungen im Terminal verbunden ist) über die Einstellungen des Terminals (historisch gesehen ein physisches Objekt, jetzt ein Terminalemulator). Wenn Sie Screen oder eine ähnliche Terminal-in-Terminal-Software ausführen, müssen Sie sttyin jedem Bildschirmfenster ausgeführt werden (aber normalerweise kann Screen so konfiguriert werden, dass es aus seiner Konfigurationsdatei das Richtige tut, wenn es nicht sofort funktioniert ).

Der Unterschied im Verhalten, den Sie von netcatvs. beobachten, telnetist auf die Art und Weise zurückzuführen, wie das Terminal verwendet wird: * In netcat befindet sich das Terminal im zeilenweisen Modus (auch als „gekochter Modus“ bezeichnet). Sie bearbeiten eine Zeile (mithilfe der integrierten Edition-Funktion des lokalen Terminals und damit insbesondere der lokalen Stty-Einstellungen) und senden sie dann im endgültigen Zustand an den Remote-Host. * In Telnet befindet sich das (lokale) Terminal im zeichenweisen Modus (auch als "Raw-Modus" bezeichnet). Jeder Tastendruck geht direkt an Telnet, das ihn sofort an das Remote-System weiterleitet. Sie sind abhängig von den Line Edition-Funktionen des Remote-Systems.

Es gibt defekte Programme, die sich nicht um die Terminaleinstellungen kümmern. Sieht so aus, als hätten Sie einen von ihnen getroffen. Am besten ändern Sie die Konfiguration Ihres Terminals. Das Gleiche gilt, wenn Sie über ein Remote-Protokoll wie Telnet oder SSH mit einem Gerät kommunizieren müssen und das Gerät nicht konfigurierbar ist.

Mit xterm ist es einfach: Es gibt eine Einstellung zum Umschalten des vom BackSpaceSchlüssel zur Laufzeit gesendeten Zeichens . Schalten Sie im Menü der linken Taste auf "Löschen ist ENTF" um. Programmatisch, senden Sie die Escape - Sequenz \e[?67h zu haben , BackSpacesenden ^hoder \e[?67lhaben , BackSpacesenden ^?. Die entsprechende Ressource ist XTerm.backarrowKeyIsErase. Andere Terminalemulatoren können eine ähnliche Schnittstellenfunktion haben oder nicht oder die Escape-Sequenz unterstützen.

Viele Terminalemulatoren senden einen von ^hoder ^?wenn Sie drücken BackSpace, und den anderen Charakter, wenn Sie Ctrl+ drücken BackSpace. Dies kann zur Not nützlich sein.

Beachten Sie, dass showkeysund Freunde nur auf der Linux-Konsole relevant sind, nicht in X.

Gilles 'SO - hör auf böse zu sein'
quelle