Backspace, Tab не работает в терминале (используя ssh)


37

Когда я захожу на другую машину с Debian с моей учетной записью (с разрешениями sudo), моя клавиша Backspace генерирует некоторые неудобные символы при нажатии. Также Tab& delключи тоже не работают.

С другой стороны, у меня также есть другая учетная запись на той же машине, и когда я ssh через эту учетную запись, его терминал работает отлично. Я не мог понять, почему это происходит.

Ответы:


37

Я видел такие проблемы раньше.

Возьмем, к примеру, backspace: удаленный хост ожидает, что некоторый символ будет использоваться как «стирание / возврат», в то время как вы нажимаете backspace в терминале, программа терминала отправит некоторый символ на удаленный хост, если то, что ожидает удаленный хост, отличается от символы, отправленные программой терминала, вы столкнетесь с этой проблемой. Итак, быстрое исправление, как показано ниже:

  1. запустите команду #stty -aна удаленном хосте и найдите, что ожидается в качестве кода стирания в выходных данных. Say erase=^?.
  2. В терминале введите Ctrlvи нажмите клавишу возврата. Вы увидите, какой код отправляется как «стереть». Скажи это ^H.
  3. На удаленном хосте запустите #stty erase ^H.
    (Примечание: используйте Ctrlv+ Backspace, не вводите ^ вручную)

Вы можете решить проблему с вкладкой так же, как указано выше.


Мой символ возврата на задний план - это какой-то специальный символ, похожий на перевернутый треугольник. Так что не работает
gopi1410

1
Этот простой комментарий, безусловно, лучшее решение, которое я видел в этом. Это похоже на клудж, но это работает.
Пауло Матос

Это сработало для меня! Однако я не понимаю, почему моя оболочка обрабатывает backspace, как ожидалось, а чтение из stdin в моем приложении - нет. Внесение предложенных вами изменений приводит к тому, что backspace работает для обоих. Насколько я понимаю, оболочка обрабатывает буферизацию стандартного ввода, поэтому разве обработка возврата не должна быть одинаковой как для оболочки, так и для приложения?
Самуил

1
Что если код вообще не отправлен? Ctrlv + backspace ничего не производит ...
Манфредо

Для меня код возврата такой же, как stty -aвывод, но все еще не работает
Matej J

36

Помимо решения "stty", вы можете попробовать решение "TERM".

Вы подключаетесь к Debian из какого-либо терминала (putty, solaris dterm, debain xterm, you-name-it), возможности этого терминального объявления (который включает в себя такие ключи, как Backspace и Tab) через переменную окружения TERM.

Итак, после ssh для unix host (это не зависит от debian it или другого host) установите переменную TERM в соответствии с вашим терминалом. Предположим, вы используете bash в качестве оболочки и vt100 в качестве терминала:

export TERM=vt100

PS: TERM должен быть объявлен через ssh автоматически, но в некоторых случаях эта магия не работает.


все еще не работает :(
gopi1410

Какой терминал вы используете? А какое значение TERM вы пробовали?
Пол

Я попробовал vt100. Как мне узнать значение TERM? Я пробовал ssh из cygwin (в windows) в Debian. Если есть проблемы с Cygwin, я даже попробовал это с терминала Ubuntu, но та же проблема.
gopi1410

Не уверен, что Cygwin имеет хорошую эмуляцию терминала, насколько я знаю, Cygwin просто использует обычную консоль Windows, в которой отсутствует эмуляция терминала (может быть, это неправильно). С убунту все должно работать просто отлично. Что-то не так с библиотекой shell или termcap в Debian. Войдите в систему из Ubuntu и выдайте мне команды: 1. echo $ TERM 2. stty -a
paul

2
Хотя это не помогло мне напрямую, поскольку TERM был правильно установлен, это помогло выявить проблему. Мне не хватало записей terminfo для моего терминала. Я использую urxvt и на arch вам нужно установить rxvt-unicode-terminfo, чтобы исправить эту проблему
Xandaros

15

Это потому , что по умолчанию оболочка sh, использовать bash, просто запустить bashиз вашей оболочки.

bash

Чтобы установить в bashкачестве оболочки по умолчанию:

chsh -s /bin/bash 

или

sudo chsh -s /bin/bash yourusername

2
Этот исправил это для меня. Никогда, даже не смотря на мою регистрационную оболочку!
Джеймс Пак

2
Я вижу эту проблему, но моя оболочка bash.
fraxture

6

Ваша оболочка может быть установлена /bin/shвместо/bin/bash


1
Связанные с этим ответом: unix.stackexchange.com/questions/50542/…
Сэмюэль


Это было бы более полезно, если бы оно объяснило немного больше и как это изменить, но это была моя проблема. Спасибо @Tom за вашу ссылку, которая исправила проблему для меня.
Джейк,

Это было причиной в моем случае .. для этого конкретного пользователя. Никакая оболочка не была определена в /etc/passwd, когда я добавил :/bin/bashк его строке, это работало. Вы можете узнать, с какой оболочкой используетсяecho $0
MSpreij

6

Я обычно использую это, чтобы исправить любой вывод прикольных символов в моем терминале. Сбрасывает все специальные символы к значениям по умолчанию.

stty sane

Со страницы руководства stty:

То же самое, что и cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany -xcase -tostop -echoprt echoctl echoke, все специальные символы имеют значения по умолчанию


2

В дополнение к ответу Пола, если вы хотите сохранить возможность получать красочный вывод, вы можете использовать xterm-88color

echo 'export TERM=xterm-88color' >> ~/.bashrc
source ~/.bashrc

1
toe -aпоказывает список поддерживаемых типов терминалов ... xterm-88colorэто далеко не единственный вариант, и на самом деле он может быть недоступен в определенных системах.
0xC0000022L
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.