Backspace в оболочке перемещает курсор вправо

Backspace в оболочке перемещает курсор вправо

Есть эта удаленная оболочка, в которую я вхожу, и когда я пытаюсь удалить символ, вместо визуального отображения удаляемого символа он остается там, а курсор перемещается вправо. Эта оболочка запускает Bash.

Например, если я введу echooи нажму Backspaceодин раз, приглашение будет выглядеть так: echoo. Однако на самом деле присутствующие символы будут правильными ( echo), и если я нажму , Enterкоманда выполнится нормально.

Насколько я могу судить, это точно тот же вопрос, который был открытздесь. Я тоже подключаюсь через Kubernetes. Команда, которую я запускаю, выглядит примерно так kubectl -n <some_kind_of_argument> exec -it <another_argument> -- bash.

Прочитав другие вопросы, я понял, что следующая информация полезна.


root# echo $TERM
xterm

Это не то же самое значение, которое выводит моя локальная оболочка ( xterm-256color). Следующее не исправляет проблему.

root# export TERM=xterm-256color

Теперь я делюсь выводом stty -a.

root# stty -a
speed 38400 baud; rows 43; columns 118; line = 0;
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; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar 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 -flusho -extproc

Теперь нажатие Ctrl+ vи последующее нажатие Backspaceвыводит следующее:

root# ^?

Кажется, это соответствует выводу выше ( erase = ^?). Нажатие Enter в приведенном выше приглашении печатает...

bash: $'\177': command not found

Я тоже побежал stty sane, но это не помогло.


Может ли кто-нибудь помочь мне исправить это и, надеюсь, также помочь мне понять, что происходит?

решение1

Удаленная оболочка/приложение, которое вы используете, ожидает отправки клавиши backspace ^H(что обычно перемещает курсор влево на одну ячейку вТерминал). Оболочка/приложение печатает пробел для стирания символа. Но оно не ожидает ^?(ASCII DEL, код 127), что обычно не перемещает курсор вТерминал.

Однако на самом деле присутствующие символы будут правильными (echo), и если я нажму Enter, команда выполнится нормально.

Комментарий в вопросе говорит, что оболочка/приложение на самом деле обрабатывает ^?как символ стирания, но в каком-то смысле это может быть жестко закодировано. Но если это не жестко закодировано, оно может обращать внимание на настройку stty. Если это так, вы можете сделать это в своей (удаленной) инициализации оболочки

stty erase ^H

(реальный элемент управления/ H...) и затем используйте ControlH, вместо Backspace(или измените конфигурацию терминала, чтобы отправить ^Hвместо ^?).

Связанный контент