SSH-Rücktaste funktioniert nicht, bis ich TERM=xterm manuell ausführe

SSH-Rücktaste funktioniert nicht, bis ich TERM=xterm manuell ausführe

sshMir ist klar, dass die Rücktaste jetzt in einer Sitzung funktionieren könnte, wenn TERMsie falsch eingestellt ist. Aber seltsamerweise habe ich einen Server, auf dem TERMsie richtig eingestellt ist, aber die Rücktaste funktioniert nicht, bis ich sie manuell TERM=xtermin der Shell einstelle (was überflüssig sein sollte). Siehe hier:

~ ] 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

Ich würde sagen, in etwa 90 % der Fälle funktioniert die Rücktaste nicht, bis ich ausführe TERM=xterm, und in 10 % der Fälle muss ich den TERM=Befehl nicht ausführen, da die Rücktaste bereits funktioniert. Ich habe die Ausgabe envfür jeden Fall verglichen und sie sind identisch (abgesehen davon SSH_CLIENT, SSH_CONNECTIONdass sich nur der Client-Port geändert hat).

Irgendeine Idee, was dieses Verhalten verursachen könnte oder wie es umgangen werden könnte?


Reaktion auf Kommentare

Ich verwende OpenSSH_6.8p1, BoringSSLvon https://android.googlesource.com/platform/external/opensshund führe GNU bash, version 4.3.42(1)-release (arm-android-eabi)von aushttps://github.com/CyanogenMod/android_external_bash.git

stty -azeigt keinen Unterschied vor und nach dem Setzen XTERM. Die Ausgabe ist:

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'zeigt auch keinen Unterschied vor und nach der Einstellung XTERM. Die Ausgabe ist:

"\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)

Interessanterweise funktioniert meine Rücktaste wieder , wenn ich sourcemeine drücke . Ich weiß jedoch, dass die beim Anmelden als Quelle verwendet wird, da dies der einzige Ort ist, an dem ich meinen Wert einstellebashrcbashrcPs1

Antwort1

Scheint eine Readline/Terminal-Interaktion zu sein. Überprüfen Sie zunächst während des Anmeldevorgangs Ihre Umgebungsvariable .inputrc, /etc/inputrc, /etc/default/login, und dann die Readline-Bindungen (über ).INPUTRCbind -q backward-delete-char

Es schadet nicht, auch die Angaben in den Client- (ssh_config) SendEnvund Server- AcceptEnvAnweisungen (sshd_config) zu überprüfen, falls überhaupt welche vorhanden sind (obwohl dies TERMin OpenSSH nicht auf diese Weise vom Client zum Server gesendet wird, schließt der Client den TERMWert immer in die Sitzungskonfiguration ein und der Server legt TERMihn entsprechend fest). Das gelegentliche Vorhandensein von TERMINFOoder TERMCAPin der Umgebung ist das einzige, was mir als Erklärung für die intermittierende Natur dieses Problems einfällt.

Readline wendet „Rubout“ auf alles an, was das Terminal als „Löschen“ deklariert, und Rubout ist das, was Readline über aufruft backward-delete-char.

TERMist eine der speziellen Variablen, die bash überwacht, wenn sie gesetzt ist (unabhängig davon, ob sieÄnderungen)bash setzt das Terminal zurück:

/* 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"));
}

(wobei " " , und TERMxxxbedeutet ) Dies erklärt, warum durch das einfache Setzen des aktuellen Werts tatsächlich eine Aktion ausgeführt wird.TERMTERMCAPTERMINFOTERM

Wenn Sie es nicht finden können, können Sie es möglicherweise umgehen , indem TERM=${TERM}Sie am Ende von .profile/ " " hinzufügen..bashrc

Als letzten Ausweg können Sie auch einige forensische Maßnahmen versuchen, wie in meiner Antwort hier beschrieben:Benutzer überwachen und benachrichtigen, wenn sich die STY-Einstellungen ändern?

verwandte Informationen