telnet/ssh에서 백스페이스에 crtl-H를 사용하도록 강제

telnet/ssh에서 백스페이스에 crtl-H를 사용하도록 강제

Cisco Serial Term Server에 몇 개의 장치가 연결되어 있는데 telnetCisco 포트에 직접 연결하면 많은 장치가 제대로 작동합니다. 그러나 Backspace기본적으로 텔넷에 매핑되어 있기 때문에 사용하지 않을 완고한 장치가 있습니다 .

만일을 대비해 rxvtDebian squeeze에서 원격으로 (X Window에서) 로그인했습니다. TERM으로 설정되어 있지만 , 또는 ...을 rxvt사용하여 변경해도 효과가 없습니다. 프로젝트에서 본 것을 바탕으로 변화의 길을 걷기 시작했습니다.vt100vt101xtermTERMTERM올드 커밋 FAQ. FWIW, stty erase ^h그것도 stty erase ^?작동하지 않습니다.

원시 TCP 소켓을 사용하면 Backspace... 이러한 장치에서는 제대로 작동하지만 비밀번호가 숨겨지지 않거나 터미널 페이징과 관련된 다른 문제가 있습니다.netcatnc 192.168.12.117 2006

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

편집하다

showkey -a중요한 경우 합계 에 해당 하는 관련 키의 출력은 다음 ^?과 같습니다 . Backspace좀 더 자세히 살펴봐야 할 것 같습니다^HCtrlHLinux 키보드 및 콘솔 가이드, 하지만 이것을 변경하기 위해 무엇을 할 수 있는지 해독할 수 없는 것 같습니다. 다양한 주문을 시도했지만 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]$

답변1

드디어 답을 찾았어요앤 바레타의 리눅스 키보드 수치의 전당... 처럼 보인다xterm/에서 키 매핑을 변경해도 rxvt이점이 없습니다 .telnet.

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

해결책

(아래)라는 스크립트를 생성 kbdfix하고 권한을 사용하여 실행 가능하게 만드세요 . 755배포 아카이브에서 tclsh및 패키지를 로드해야 합니다.expect

#!/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>텔넷을 연결하는 경우에는 kbdfix ssh 172.16.1.26.

답변2

프로그램은 백스페이스 문자가 무엇인지 알아내기 위해 터미널 설정을 쿼리해야 합니다( ^h그리고 ^?, 즉 \010, 및 는 \177두 가지 선택 항목입니다). 터미널이 보내는 내용을 선언하려면 stty erase '^h'또는 를 사용하세요 .stty erase '^?'

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

netcat관찰된 동작의 차이는 telnet터미널이 사용되는 방식에 따른 것입니다. * netcat에서 터미널은 프로그레시브 모드("요리 모드"라고도 함)입니다. 로컬 터미널에 내장된 편집 기능, 특히 로컬 stty 설정을 사용하여 행을 편집한 다음 최종 상태로 원격 호스트에 보냅니다. * 텔넷에서 (로컬) 터미널은 문자별 모드("원시 모드"라고도 함)입니다. 각 키 입력은 Telnet으로 직접 이동한 다음 즉시 원격 시스템으로 전달됩니다. 원격 시스템의 회선 버전 기능을 사용합니다.

터미널 설정에 신경쓰지 않는 일부 손상된 프로그램이 있습니다. 당신도 그들 중 한 명을 만난 것 같습니다. 가장 좋은 방법은 터미널의 구성을 변경하는 것입니다. 원격 프로토콜(예: Telnet 또는 SSH)을 통해 장치와 통신해야 하고 장치를 구성할 수 없는 경우에도 마찬가지입니다.

BackSpacexterm을 사용하는 것은 쉽습니다. 런타임에 키 입력으로 전송된 문자를 전환하는 설정이 있습니다 . 왼쪽 버튼 메뉴에서 "Delete is DEL"을 전환합니다. 프로그래밍 방식으로 보내기이스케이프 시퀀스 \e[?67h보냄 또는 보냄 .BackSpace ​해당 리소스는 입니다 . 다른 터미널 에뮬레이터는 유사한 인터페이스 기능을 갖거나 갖지 않을 수도 있고 이스케이프 시퀀스를 지원할 수도 있습니다.^h\e[?67lBackSpace^?XTerm.backarrowKeyIsErase

많은 터미널 에뮬레이터는 또는 키를 누르면 문자 중 하나를 보내고 ^h+를 누르면 다른 문자를 보냅니다. 이것은 핀치에 유용합니다.^?BackSpaceCtrlBackSpace

친구와 함께하는 것은 showkeysX가 아닌 Linux 콘솔에서만 관련이 있습니다.

답변3

백스페이스와 Control-H는 동일하게 설계되었지만 요즘 특히 Linux에서는 백스페이스를 사용하여 삭제를 보내고 삭제는 이상한 이스케이프 시퀀스를 보내는 경우가 많습니다.

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

관련 정보