백스페이스가 잘못 설정된 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, BoringSSL
에서 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)
흥미롭게도 source
을 사용 하면 bashrc
백스페이스가 다시 작동하기 시작합니다. 나는 그것이 내 가치를 bashrc
설정하는 유일한 장소이기 때문에 로그인 시 소스가 제공된다는 것을 알고 있습니다 .Ps1
답변1
readline/terminal 상호 작용처럼 보입니다. 로그인 프로세스 중에 , .inputrc
, /etc/inputrc
, /etc/default/login
환경 변수를 확인한 다음 (를 통해 ) readline 바인딩을 확인하십시오.INPUTRC
bind -q backward-delete-char
클라이언트(ssh_config) SendEnv
및 서버(sshd_config AcceptEnv
) 지시문에 무엇이 있는지 다시 확인하는 것도 해롭지 않습니다. TERM
OpenSSH에서 클라이언트에서 서버로 전송되지는 않지만 클라이언트는 항상 TERM
세션 설정에 값을 포함하고 서버 세트에는 TERM
그것을 통해서). 환경의 간헐적인 존재는 TERMINFO
이것이 간헐적으로 나타나는 특성을 설명하기 위해 제가 생각할 수 있는 유일한 것입니다.TERMCAP
Readline은 터미널이 "erase"라고 선언한 모든 것에 "rubout"을 적용하고 rubout은 readline이 를 통해 호출하는 것입니다 backward-delete-char
.
TERM
bash가 설정될 때 모니터링하는 특수 변수 중 하나입니다(설정 여부에 관계 없음).변화)bash는 터미널을 재설정합니다:
/* 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 설정이 변경되면 모니터링하고 사용자에게 경고하시겠습니까?