텔넷 / SSH에서 백 스페이스에 crtl-H를 사용하도록 설정


9

시스코 직렬 용어 서버에 연결된 일부 장치가 있습니다. 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]$

1
당신은 시도 했습니까 ssty erase '^?'? 장치가을 주장하면 C-h텔넷 호출이 아니며 터미널 (에뮬레이터)입니다.
Gilles 'SO- 악마 그만해'

@Gilles 귀하의 의견이 실제로 정확하지 않습니다, 아래 내 답변을 참조하십시오
Mike Pennington

답변:


10

마지막으로 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입니다.


2
stty erase $"backspace"키를 "$"에 매핑하지 않으면 tty 드라이버에 문자를 지우려면 "$"키를 사용해야한다고 지시합니다. 텔넷을 실행하면 원시 모드이므로이 설정이 무시됩니다. 간단한 해결책은 터미널 에뮬레이터가 백 스페이스에 ^ H를 보내도록 구성하는 것입니다. 하나님의 의도대로 또 다른 하나는 예상을 사용하여 이러한 문자를 즉시 ​​변환하는 핵을 사용하는 것입니다.
jlliagre

@jlliagre, 예, 사용했을 때 키보드의 읽기가 어떻게 stty바뀌지 않았 는지 발견했습니다 . 그러나이 중요한 사실은 내가 스니핑 할 때까지 분명하지 않았습니다. Backspace를 사용 하여 어떻게 사용할 수 있는지 조사 할 것 입니다 . 또는 다른 용어를 찾는 것에 대해 생각해야 할 수도 있습니다. telnetwiresharkControl_hrxvt
Mike Pennington

@ Mike : 나는 여전히 당신이 무언가에 대해 혼란스러워한다고 생각합니다 (나는 jlliagre 나 명시 적으로 언급하지 않았으며 내 대답을 업데이트했습니다). stty응용 프로그램 쪽에서 실행해야합니다. 나는 telnet입력 문자를 번역하거나 당신이 사용해야한다고 의심 합니다 script. stty원격 컴퓨터에서 실행 하면 트릭을 수행 할 수 있습니다.
Gilles 'SO- 악마 그만해'

@Gilles, 원격 컴퓨터는 네트워크 장치 stty입니다.
Mike Pennington

1
@Mike : netcat을 사용하면 터미널이 쿠킹 모드에 있습니다. 라인을 작성하고 로컬 에서 편집하여 Enter전송합니다. 텔넷을 사용할 때 터미널은 원시 모드입니다. 각 문자는 즉시 응용 프로그램으로 전송됩니다. 예를 들어이 페이지 의 시작 또는 이 Wikipedia 기사를 참조하십시오 .
Gilles 'SO- 악마 그만

3

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

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


귀하의 질문은 텔넷이 내가 틀렸다고 생각하는 백 스페이스 키를 특정 처리하고 있다고 가정합니다. 나는 실제로 답변 대신 의견으로 언급해야합니다.
jlliagre

AFAICT telnet는 키보드의 로컬 터미널 매핑에주의를 기울이지 않습니다. 키보드와 텔넷에 관한 Anne Barreta의 노트
Mike Pennington

stty가하는 일을 오해하는 것이 두렵습니다.
jlliagre

3

프로그램 (백 스페이스 문자가 무엇인지 알아 내기 위해 터미널 설정을 쿼리로되어있다 ^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. 내에서, 리눅스 콘솔에서만 관련이없는

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.