ssh
Mir ist klar, dass die Rücktaste jetzt in einer Sitzung funktionieren könnte, wenn TERM
sie falsch eingestellt ist. Aber seltsamerweise habe ich einen Server, auf dem TERM
sie richtig eingestellt ist, aber die Rücktaste funktioniert nicht, bis ich sie manuell TERM=xterm
in 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 env
für jeden Fall verglichen und sie sind identisch (abgesehen davon SSH_CLIENT
, SSH_CONNECTION
dass 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, BoringSSL
von https://android.googlesource.com/platform/external/openssh
und führe GNU bash, version 4.3.42(1)-release (arm-android-eabi)
von aushttps://github.com/CyanogenMod/android_external_bash.git
stty -a
zeigt 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 source
meine drücke . Ich weiß jedoch, dass die beim Anmelden als Quelle verwendet wird, da dies der einzige Ort ist, an dem ich meinen Wert einstellebashrc
bashrc
Ps1
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 ).INPUTRC
bind -q backward-delete-char
Es schadet nicht, auch die Angaben in den Client- (ssh_config) SendEnv
und Server- AcceptEnv
Anweisungen (sshd_config) zu überprüfen, falls überhaupt welche vorhanden sind (obwohl dies TERM
in OpenSSH nicht auf diese Weise vom Client zum Server gesendet wird, schließt der Client den TERM
Wert immer in die Sitzungskonfiguration ein und der Server legt TERM
ihn entsprechend fest). Das gelegentliche Vorhandensein von TERMINFO
oder TERMCAP
in 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
.
TERM
ist 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 TERMxxx
bedeutet ) Dies erklärt, warum durch das einfache Setzen des aktuellen Werts tatsächlich eine Aktion ausgeführt wird.TERM
TERMCAP
TERMINFO
TERM
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?