TERM=xterm을 수동으로 실행할 때까지 SSH 백스페이스 키가 작동하지 않습니다.

TERM=xterm을 수동으로 실행할 때까지 SSH 백스페이스 키가 작동하지 않습니다.

내가 아는 한, 백스페이스 키가 올바르게 설정되지 않은 ssh경우 TERM세션 내에서 작동할 수 있습니다 . 하지만 이상하게도 서버가 올바르게 설정되어 있는데 셸에서 수동으로 설정할 TERM때까지 백스페이스 키가 작동하지 않습니다 (중복되어야 함). TERM=xterm이봐:

~ ] ssh [email protected]
root 192.168.10.40 / # echo $0
-bash
root 192.168.10.40 / # echo $TERM
xterm-256color
root 192.168.10.40 / #     # backspace does not work :(
root 192.168.10.40 / # 
root 192.168.10.40 / # TERM=xterm-256color
root 192.168.10.40 / # # now backspace works!!
root 192.168.10.40 / # logout

백스페이스 키를 실행할 때까지 백스페이스 키가 작동하지 않는 경우가 약 90%이고, 백스페이스 키가 이미 작동하기 때문에 명령을 TERM=xterm실행할 필요가 없는 경우가 10%입니다 . 각 사례의 출력을 TERM=비교했는데 env동일합니다( 클라이언트 포트만 변경된 SSH_CLIENT것을 제외하고).SSH_CONNECTION

이 동작의 원인이 무엇인지, 해결 방법이 무엇인지 아시나요?


댓글에 대한 응답

나는 OpenSSH_6.8p1, BoringSSLfrom을 사용하고 있고 from을 https://android.googlesource.com/platform/external/openssh사용하고 있습니다 .GNU bash, version 4.3.42(1)-release (arm-android-eabi)https://github.com/CyanogenMod/android_external_bash.git

stty -a디스플레이 설정 전후에는 차이가 없습니다 XTERM. 출력은 다음과 같습니다

speed 38400 baud; rows 102; columns 319; line = 2;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

bind -p|egrep 'delete|rubout|kill'또한 설정 전과 설정 후 차이가 없음을 보여줍니다 XTERM. 출력은 다음과 같습니다

"\C-h": backward-delete-char
"\C-?": backward-delete-char
"\C-x\C-?": backward-kill-line
"\e\C-h": backward-kill-word
"\e\C-?": backward-kill-word
# copy-region-as-kill (not bound)
"\C-d": delete-char
"\e[3~": delete-char
# delete-char-or-list (not bound)
"\e\\": delete-horizontal-space
# forward-backward-delete-char (not bound)
"\C-k": kill-line
# kill-region (not bound)
# kill-whole-line (not bound)
"\ed": kill-word
# shell-backward-kill-word (not bound)
# shell-kill-word (not bound)
# unix-filename-rubout (not bound)
"\C-w": unix-word-rubout
# vi-delete (not bound)
# vi-delete-to (not bound)
# vi-overstrike-delete (not bound)
# vi-rubout (not bound)

흥미롭게도 을 누르면 sourcebashrc스페이스 키가 다시 작동하기 시작합니다. 값을 설정한 bashrc유일한 장소 이기 때문에 로그인 시 정보를 얻는다는 것을 알고 있습니다.Ps1

답변1

readline/terminal 상호 작용처럼 보입니다. 먼저 로그인 중에 .inputrc, /etc/inputrc, /etc/default/login, 환경 변수를 확인한 INPUTRC다음 readline이 바인딩됩니다(passes bind -q backward-delete-char).

또한 클라이언트(ssh_config) SendEnv및 서버(sshd_config AcceptEnv) 지시어에 무엇이 있는지 다시 확인하는 것도 나쁘지 않습니다( TERMOpenSSH에서는 이 방식으로 클라이언트에서 서버로 전송되지 않지만 클라이언트는 항상 TERM세션 설정 값에 포함됩니다). , 서버는 TERM이것으로 설정됩니다). 이것이 간헐적으로 발생한다고 설명할 수 있는 유일한 이유는 TERMINFO환경에 가끔 존재하기 때문입니다.TERMCAP

Readline은 터미널이 "삭제"라고 선언한 모든 것에 "rubout"을 적용하고 rubout은 를 통해 readline이 호출되는 것입니다 backward-delete-char.

TERMbash가 설정될 때 모니터링하는 특수 변수 중 하나입니다.다양성)배쉬 재설정 터미널:

/* What to do just after one of the TERMxxx variables has changed.
   If we are an interactive shell, then try to reset the terminal
   information in readline. */
void
sv_terminal (name)
     char *name;
{
  if (interactive_shell && no_line_editing == 0)
    rl_reset_terminal (get_string_value ("TERM"));
}

(여기서 " TERMxxx" 는 TERM, TERMCAP및 을 의미합니다 TERMINFO.) 따라서 TERM현재 값으로 설정하기만 하면 실제로 작업이 수행되는 이유가 설명됩니다.

찾을 수 없는 경우 TERM=${TERM}/ 끝에 ""를 추가하는 것이 해결 방법일 수 있습니다..profile.bashrc

최후의 수단으로 내 답변에 언급된 대로 몇 가지 법의학 조치를 시도해 볼 수도 있습니다.stty 설정이 변경되면 사용자에게 모니터링하고 경고합니까?

관련 정보