텔넷 / SSH에서 백 스페이스에 crtl-H를 사용하도록 설정 및 중 하나가 작동하지 않습니다.stty erase ^hstty

시스코 직렬 용어 서버에 연결된 일부 장치가 있습니다. telnetCisco의 포트에 직접 연결 하면 많은 것이 잘 작동합니다 . 그러나 Backspace기본적으로 텔넷에 매핑되어 사용되지 않는 완고한 장치가 몇 개 있습니다.

중요한 경우, rxvtDebian squeeze (X Window)에서 telnet으로 연결 합니다. TERM로 설정되어 rxvt있지만, 내가 사용 여부를 중요하지 않습니다 vt100, vt101또는 xterm변경하면 … TERM아무런 영향을 미치지 않습니다. 나는 오래된 Kermit FAQTERM 에서 보았던 것을 기반으로 변화의 길을 시작했습니다 . FWIW는, 및 중 하나가 작동하지 않습니다.stty erase ^hstty erase ^?

나는 것으로 나타났습니다 Backspace올바르게 이러한 장치에서 작동 내가로부터 원시 TCP 소켓을 사용하는 경우 netcat… 즉 nc 192.168.12.117 2006, 그러나 암호가 숨겨져 있지 않거나 터미널 페이징이 아닌 다른 문제가 발생합니다.

텔넷과 ssh를 선택적으로 이러한 장치 에 매핑 Backspace하도록 강제하려면 어떻게 CtrlH해야합니까? 또한 이것이 장치의 버그인지 평가하기 위해 어떤 기준을 사용해야합니까?

편집하다

중요한 경우, 이것은 showkey -a해당 키 의 출력입니다 …에 ^?해당 Backspace하고 ^H입니다 CtrlH. 리눅스 키보드와 콘솔 하우투를 살펴보면 가까워 질 것 같지만 이것을 바꾸기 위해 할 수있는 일을 해독 할 수는 없습니다. 나는 loadkeys효과가없는 다양한 주문을 시도했다 .

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

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

나는 또한 관련 출력을 포함 dumpkeys하고 있습니다 … 이것은 내 시스템의 현재 매핑입니다 (문제의 일부 장치에서는 작동하지 않습니다). Backspace와 같은 일을 하는 방법을 알 수 있다면 CtrlH해결책이 있습니다.

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


답변

마지막으로 Anne Baretta의 Linux Keyboard Hall of Shame 에서 답을 찾았습니다 … / 에서 키 매핑xtermrxvttelnet변경 하면 좋지 않습니다 .

텔넷 연결을 스니핑 할 때이를 확인했습니다. 먼저 텔넷 세션을 스니핑 하고 호스트로 Backspace보내는 것을 보았습니다 0x7f. 다음으로 의도적 Backspace으로 rxvt사용했습니다 stty erase $(따라서 백 스페이스를 달러 기호에 매핑합니다 rxvt). 이 작업을 수행 한 후의 $백 스페이스에 도달 해야 rxvt했지만 원격 호스트에서 사용할 때 telnet여전히 전송 되었습니다.0x7fBackspace

해결책

kbdfix(아래) 라는 스크립트를 작성하고 755권한으로 실행 가능하게하십시오 . 배포 아카이브에서로드 된 tclshexpect패키지 가 필요합니다 .

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

이제 깨진 호스트에 연결하기 위해 입력 kbdfix telnet 192.168.12.117 2006하고 Backspace작동합니다.

2006 년까지 혼란스러워하는 사람은 Cisco 용어 서버가 손상된 장치의 콘솔 (이 경우 Brocade FCX 스위치)에 대한 직렬 연결에 사용하는 TCP 포트입니다.

마음에 들지 않는 장치에 단순히 전화를 연결하는 경우을 Backspace사용 kbdfix telnet <addr_of_the_broken_device>합니다. 비슷한 문제가있는 DLink DGS-3200 이더넷 스위치로 ssh 할 때 이것을 ssh와 함께 사용하고 있습니다. 구문은 kbdfix ssh 172.16.1.26입니다.


답변

백 스페이스와 Control-H는 같은 것으로 설계되었지만 오늘날 특히 Linux에서는 백 스페이스 전송으로 삭제 및 삭제가 이상한 이스케이프 시퀀스를 전송하는 경우가 많습니다.

어쨌든 내가 아는 한 텔넷 또는 TERM 변수는 백 스페이스가 보내는 것을 변경해서는 안되며, 이는 일반적으로 터미널 에뮬레이터 구성 기능입니다.


답변

프로그램 (백 스페이스 문자가 무엇인지 알아 내기 위해 터미널 설정을 쿼리로되어있다 ^h하고 ^?, 즉 \010\177두 개의 선택이 부족하다). stty erase '^h'또는 stty erase '^?'터미널을 사용 하여 보내는 내용을 선언하십시오.

터미널 내부에서 원격으로 (telnet, rsh 또는 ssh를 사용하여) 로그인 stty 하는 경우 응용 프로그램 측에서 실행해야합니다 . stty터미널에 다른 작업을 지시하지 말고 로컬 터미널 드라이버 (즉, 터미널에서 실행되는 응용 프로그램과 인터페이스하는 부분)에 터미널 (역사적으로 물리적 개체, 이제 터미널 에뮬레이터) 설정에 대해 알립니다. 마찬가지로 Screen 또는 유사한 터미널 터미널 소프트웨어를 실행 stty하는 경우 각 화면 창에서 실행해야합니다. 그러나 일반적으로 화면이 작동하지 않으면 구성 파일에서 올바른 작업을 수행하도록 화면을 구성 할 수 있습니다 ).

netcatvs. 에서 관찰되는 동작의 차이 telnet는 터미널이 사용되는 방식으로 인한 것입니다. * netcat에서 터미널은 라인 단위 모드 ( “요리 모드”라고도 함)에 있습니다. 로컬 터미널의 내장 버전 기능, 특히 로컬 stty 설정을 사용하여 회선을 편집 한 후 최종 상태로 원격 호스트로 보냅니다. * 텔넷에서 (로컬) 터미널은 문자 별 모드입니다 ( “원시 모드”라고도 함). 모든 키 입력은 텔넷으로 직접 이동하여 텔넷으로 즉시 릴레이합니다. 원격 시스템의 라인 에디션 기능에 의존합니다.

터미널 설정에 신경 쓰지 않는 깨진 프로그램이 있습니다. 그들 중 하나를 만난 것 같습니다. 가장 좋은 방법은 터미널 구성을 변경하는 것입니다. 텔넷 또는 SSH와 같은 원격 프로토콜을 통해 장치와 통신해야하고 장치를 구성 할 수없는 경우에도 마찬가지입니다.

xterm을 사용하면 쉽습니다. BackSpace런타임에 키가 보낸 문자를 토글하는 설정이 있습니다 . 왼쪽 버튼 메뉴에서 “Delete is DEL”을 토글하십시오. 프로그래밍 방식의 전송 이스케이프 시퀀스를 \e[?67h 가지고 BackSpace전송을 ^h, 또는 \e[?67l가지고 BackSpace보내기 ^?. 해당 리소스는 XTerm.backarrowKeyIsErase입니다. 다른 터미널 에뮬레이터는 유사한 인터페이스 기능을 갖거나 이스케이프 시퀀스를 지원하지 않을 수 있습니다.

많은 터미널 에뮬레이터는 을 누를 때 ^h또는 ^?을 누를 때 BackSpace와 다른 문자를 Ctrl+ 를 누를 때 보냅니다 BackSpace. 이것은 핀치에 유용 할 수 있습니다.

참고 그 showkeys친구는 X. 내에서, 리눅스 콘솔에서만 관련이없는