Zmusza telnet / ssh do używania crtl-H dla backspace


9

Mam niektóre urządzenia podłączone do serwera terminów szeregowych Cisco; wiele z nich działa dobrze, gdy jestem telnetbezpośrednio w porcie Cisco. Mam jednak kilka upartych urządzeń, które nie będą używane, Backspaceponieważ są domyślnie mapowane w usłudze Telnet.

W przypadku, gdy ma to znaczenie, wysyłam telnet spod rxvtściśnięcia Debiana (w X Window). TERMjest ustawiony rxvt, ale to nie ma znaczenia, czy mogę używać vt100, vt101albo xterm... Zmiana TERMnie ma wpływu. Rozpocząłem proces zmiany w TERMoparciu o to, co widziałem w starym FAQ Kermit . FWIW stty erase ^hi stty erase ^?też nie działają.

Zauważyłem, że Backspacedziała poprawnie na tych urządzeniach, jeśli używam surowego gniazda TCP z netcat... tj . nc 192.168.12.117 2006; jednak potem napotykam inne problemy z niezauważonymi hasłami lub stronicowaniem terminala.

Jak mogę selektywnie zmusić telnet i ssh do mapy Backspacedo CtrlHtych urządzeń? Jakie kryteria należy zastosować, aby ocenić, czy jest to błąd w urządzeniu?

EDYTOWAĆ

W przypadku, gdy ma to znaczenie, jest to wynik showkey -adla danych kluczy ... ^?odpowiada Backspacei ^Hjest CtrlH. Wygląda na to, że powinienem być blisko, kiedy patrzę na klawiaturę Linuxa i konsolę Howto , ale nie mogę rozszyfrować, co mogę zrobić, aby to zmienić. Próbowałem różnych zaklęć bezskutecznie loadkeys.

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

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

Podaję również odpowiednie dane wyjściowe z dumpkeys... to jest bieżące mapowanie w moim systemie (które nie działa na niektórych urządzeniach). Gdybym mógł wymyślić, jak Backspacezrobić to samo CtrlH, miałbym rozwiązanie.

[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]$

1
Próbowałeś ssty erase '^?'? Jeśli urządzenia nalegają na a C-h, to nie jest to połączenie telnet, to terminal (emulator).
Gilles „SO - przestań być zły”

@Gilles twój komentarz jest właściwie niepoprawny, zobacz moją odpowiedź poniżej
Mike Pennington

Odpowiedzi:


10

W końcu znalazłem odpowiedź w Linux of Hall of Shame Anne Baretty ... wydaje się, że zmiana mapowania klawiszy w xterm/ rxvtnie przynosi pożytkutelnet .

Zweryfikowałem to, gdy wąchałem połączenie telnet. Najpierw wąchałem sesję telnet i zobaczyłem, że została Backspacewysłana 0x7fdo hosta. Następnie celowo włamałem się Backspacedo rxvtkorzystania stty erase $(w ten sposób mapowałem Backspace na znak dolara rxvt). Po zrobieniu tego musiałem trafić $w backspace rxvt, ale telnetnadal wysyłałem, 0x7fgdy korzystałem Backspacez zdalnego hosta.

ROZWIĄZANIE

Utwórz skrypt o nazwie kbdfix(poniżej) i uczyń go wykonywalnym z 755uprawnieniami; będziesz potrzebował tclshi expectpakietów załadowanych z archiwów dystrybucyjnych.

#!/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"}
}

Teraz, aby połączyć się z uszkodzonymi hostami, piszę kbdfix telnet 192.168.12.117 2006i Backspacedziała.

Uwaga dla każdego pomylonego do 2006 roku powyżej ... to jest port TCP, którego serwer terminów Cisco używa do połączenia szeregowego z konsolą uszkodzonego urządzenia (w tym przypadku przełącznika Brocade FCX).

Jeśli tylko telnetujesz do urządzenia, które nie lubi Backspace, skorzystaj kbdfix telnet <addr_of_the_broken_device>. Używam tego również z ssh, kiedy ssh do przełącznika DLink DGS-3200 Ethernet, który ma podobne problemy; składnia jest następująca kbdfix ssh 172.16.1.26.


2
stty erase $nie mapuje klawisza „backspace” na „$”, mówi sterownikowi tty, że aby usunąć znak, należy użyć klawisza „$”. Po uruchomieniu telnet jesteś w trybie surowym, więc to ustawienie jest ignorowane. Prostym rozwiązaniem byłoby skonfigurowanie emulatora terminala tak, aby wysyłał ^ H jako backspace, zgodnie z zamierzeniami boga, inny używa hacka, który tłumaczy te znaki w locie za pomocą metody expect.
jlliagre

@ jlliagre, tak, odkryłem, jak sttynie zmieniłem telnetodczytów klawiatury, kiedy używałem wireshark; jednak ten ważny fakt nie był dla mnie jasny, dopóki nie powąchałem. Zbadam, jak mogę zmienić Backspace do użycia Control_hw rxvt... a może muszę pomyśleć o znalezieniu innego terminu.
Mike Pennington

@Mike: Myślę, że nadal jesteś zdezorientowany czymś (czego nie przyznam ani Jlliagre, ani wyraźnie nie wspomniałem; zaktualizowałem swoją odpowiedź). sttymusi działać po stronie aplikacji. Bardzo wątpię w telnettłumaczenie znaków wejściowych lub tego, że musisz ich użyć script; samo uruchomienie sttyna zdalnej maszynie prawdopodobnie załatwi sprawę.
Gilles „SO - przestań być zły”

@Gilles, zdalne urządzenie jest urządzeniem sieciowym, nie ma go stty.
Mike Pennington

1
@ Mike: Kiedy używasz netcata, twój terminal jest w trybie gotowym: piszesz linię, edytujesz ją lokalnie i Enterwysyła. Gdy korzystasz z usługi telnet, twój terminal jest w trybie surowym: każdy znak jest natychmiast wysyłany do aplikacji. Zobacz np. Początek tej strony lub ten artykuł w Wikipedii .
Gilles „SO- przestań być zły”

3

Backspace i Control-H zostały zaprojektowane tak, aby były tym samym, ale obecnie, szczególnie w Linuksie, często backspace wysyła usuwanie i usuwanie wysyłające dziwną sekwencję ucieczki.

W każdym razie i o ile mi wiadomo, telnet lub zmienna TERM nie powinny zmieniać wysyłanego backspace, jest to zazwyczaj funkcja konfiguracji emulatora terminala.


Twoje pytanie opiera się na założeniu, że telnet wykonuje określone przetwarzanie klucza backspace, co moim zdaniem jest błędne. Powinienem to ująć jako komentarz zamiast odpowiedzi.
jlliagre

AFAICT, telnetnie zwraca uwagi na lokalne odwzorowania terminali klawiatury. Notatki Anne Barreta na temat klawiatury i telnetu
Mike Pennington

Obawiam się, że nie rozumiesz, co robi Stty.
jlliagre

3

Programy powinny sprawdzać ustawienia terminala, aby dowiedzieć się, co to jest znak backspace ( ^hi ^?, \010i \177, i są tam dwie możliwości). Użyj stty erase '^h'lub, stty erase '^?'aby zadeklarować, co wysyła twój terminal.

Jeśli logujesz się zdalnie (za pomocą telnet, rsh lub ssh) wewnątrz terminala, pamiętaj, że musisz działać stty po stronie aplikacji . sttynie mówi terminalowi, aby zrobił coś innego, informuje lokalny sterownik terminalu (tj. część, która łączy się z aplikacjami działającymi w terminalu) o ustawieniach terminalu (wcześniej obiekt fizyczny, obecnie emulator terminala). Podobnie, jeśli uruchamiasz Screen lub podobne oprogramowanie terminal-in-terminal, musisz uruchomić sttyw każdym oknie ekranowym (ale zazwyczaj Screen można skonfigurować tak , aby działał poprawnie z pliku konfiguracyjnego, jeśli nie działa od razu po wyjęciu z pudełka ).

Różnica w zachowaniu, którą można zaobserwować w stosunku do netcatvs., telnetwynika ze sposobu używania terminala: * W netcat, terminal działa w trybie linia po linii (zwanym także „trybem gotowym”). Edytujesz linię (używając wbudowanej funkcji edycji terminala lokalnego, a w szczególności lokalnych ustawień stty), a następnie wysyłasz go w końcowym stanie do zdalnego hosta. * W telnecie terminal (lokalny) działa w trybie znak po znaku (zwanym także „trybem surowym”). Każde naciśnięcie klawisza przechodzi bezpośrednio do telnetu, który przekazuje go natychmiast do zdalnego systemu. Jesteś zależny od funkcji edycji linii w systemie zdalnym.

Istnieją uszkodzone programy, które nie dbają o ustawienia terminala. Wygląda na to, że spotkałeś jednego z nich. Najlepiej jest zmienić konfigurację terminala. To samo dotyczy sytuacji, gdy konieczne jest komunikowanie się z urządzeniem za pomocą zdalnego protokołu, takiego jak telnet lub SSH, a urządzenia nie można skonfigurować.

Dzięki Xterm jest to łatwe: istnieje ustawienie do przełączania postaci wysyłanej przez BackSpaceklawisz w czasie wykonywania. W menu lewego przycisku przełącz „Usuń to DEL”. Programowo wysłać sekwencję ucieczki \e[?67h mieć BackSpacesend ^hlub \e[?67lmieć BackSpacesend ^?. Odpowiedni zasób to XTerm.backarrowKeyIsErase. Inne emulatory terminali mogą, ale nie muszą, mieć podobną funkcję interfejsu lub obsługiwać sekwencję zmiany znaczenia.

Wiele emulatorów terminali wysyła jeden ^hlub jeden ^?po naciśnięciu BackSpace, a drugi znak po naciśnięciu Ctrl+ BackSpace. Może to być przydatne w szczypcie.

Pamiętaj, że showkeysi znajomi są ważni tylko na konsoli Linux, a nie w X.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.