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

37

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

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

gopi1410
источник

Ответы:

37

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

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

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

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

Derui Si
источник
Мой символ возврата на задний план - это какой-то специальный символ, похожий на перевернутый треугольник. Так что не работает
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
IceFlame
источник
2
Этот исправил это для меня. Никогда, даже не смотря на мою регистрационную оболочку!
Джеймс Пак
2
Я вижу эту проблему, но моя оболочка bash.
fraxture
6

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

JM.
источник
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
beenotung
источник
1
toe -aпоказывает список поддерживаемых типов терминалов ... xterm-88colorэто далеко не единственный вариант, и на самом деле он может быть недоступен в определенных системах.
0xC0000022L