Mam niektóre urządzenia podłączone do serwera terminów szeregowych Cisco; wiele z nich działa dobrze, gdy jestem telnet
bezpoś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). TERM
jest ustawiony rxvt
, ale to nie ma znaczenia, czy mogę używać vt100
, vt101
albo xterm
... Zmiana TERM
nie ma wpływu. Rozpocząłem proces zmiany w TERM
oparciu o to, co widziałem w starym FAQ Kermit . FWIW stty erase ^h
i 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 -a
dla danych kluczy ... ^?
odpowiada Backspacei ^H
jest 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]$
ssty erase '^?'
? Jeśli urządzenia nalegają na aC-h
, to nie jest to połączenie telnet, to terminal (emulator).Odpowiedzi:
W końcu znalazłem odpowiedź w Linux of Hall of Shame Anne Baretty ... wydaje się, że zmiana mapowania klawiszy w
xterm
/rxvt
nie 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
0x7f
do hosta. Następnie celowo włamałem się Backspacedorxvt
korzystaniastty erase $
(w ten sposób mapowałem Backspace na znak dolararxvt
). Po zrobieniu tego musiałem trafić $w backspacerxvt
, aletelnet
nadal wysyłałem,0x7f
gdy korzystałem Backspacez zdalnego hosta.ROZWIĄZANIE
Utwórz skrypt o nazwie
kbdfix
(poniżej) i uczyń go wykonywalnym z755
uprawnieniami; będziesz potrzebowałtclsh
iexpect
pakietów załadowanych z archiwów dystrybucyjnych.Teraz, aby połączyć się z uszkodzonymi hostami, piszę
kbdfix telnet 192.168.12.117 2006
i 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ącakbdfix ssh 172.16.1.26
.źródło
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.stty
nie zmieniłemtelnet
odczytów klawiatury, kiedy używałemwireshark
; jednak ten ważny fakt nie był dla mnie jasny, dopóki nie powąchałem. Zbadam, jak mogę zmienić Backspace do użyciaControl_h
wrxvt
... a może muszę pomyśleć o znalezieniu innego terminu.stty
musi działać po stronie aplikacji. Bardzo wątpię wtelnet
tłumaczenie znaków wejściowych lub tego, że musisz ich użyćscript
; samo uruchomieniestty
na zdalnej maszynie prawdopodobnie załatwi sprawę.stty
.Enter
wysył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 .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.
źródło
telnet
nie zwraca uwagi na lokalne odwzorowania terminali klawiatury. Notatki Anne Barreta na temat klawiatury i telnetuProgramy powinny sprawdzać ustawienia terminala, aby dowiedzieć się, co to jest znak backspace (
^h
i^?
,\010
i\177
, i są tam dwie możliwości). Użyjstty 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 .stty
nie 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ćstty
w 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
netcat
vs.,telnet
wynika 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^h
lub\e[?67l
mieć BackSpacesend^?
. Odpowiedni zasób toXTerm.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
^h
lub 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
showkeys
i znajomi są ważni tylko na konsoli Linux, a nie w X.źródło