Backspace, Tab não funciona no terminal (usando ssh)


37

Quando ssh em outra máquina com o Debian com minha conta (com permissões sudo), minha tecla de retrocesso gera alguns símbolos estranhos ao pressionar. As teclas Tab& também delnão funcionam também.

Por outro lado, eu também tenho outra conta na mesma máquina e quando ssh através dessa conta, seu terminal funciona perfeitamente. Eu não conseguia descobrir por que isso está acontecendo.

Respostas:


37

Eu já vi esses problemas antes.

Pegue o backspace, por exemplo, o host remoto espera que algum caractere seja usado como "apagar / backspace", enquanto você pressiona backspace no terminal, o programa terminal envia algum caractere ao host remoto, se o que o host remoto espera for diferente. os caracteres enviados pelo programa do terminal, você encontrará esse problema. Portanto, uma solução rápida é a seguinte:

  1. execute o comando #stty -ano host remoto e encontre o que se espera ser um código de exclusão na saída. Diga erase=^?.
  2. No terminal, digite Ctrlve pressione seu backspace. Você verá o código enviado como "apagar". Diga que sim ^H.
  3. No host remoto, execute #stty erase ^H.
    (Nota: use Ctrlv+ Backspace, não digite ^ manualmente)

Você pode corrigir o problema da guia com o mesmo descrito acima.


Meu personagem backspace é algum símbolo especial, como um triângulo invertido. Então, não o seu trabalho
gopi1410

1
Este simples comentário é certamente a melhor solução que já vi para isso. Parece uma briga, mas funciona.
Paulo Matos

Isso funcionou para mim! O que eu não entendo é o motivo pelo qual meu shell lida com o backspace conforme o esperado, mas a leitura do stdin no meu aplicativo não. Fazer a alteração sugerida resulta em backspace trabalhando para ambos. Meu entendimento é que o shell lida com o buffer stdin; portanto, o tratamento de backspace não deve ser o mesmo para o shell e um aplicativo?
Samuel

1
E se nenhum código for enviado? Ctrlv + backspace não produz nada ...
Manfredo

Para mim, o código de backspace é o mesmo da stty -asaída, mas ainda não funciona.
Matej J

36

Ao lado da solução "stty", você pode tentar a solução "TERM".

Você faz o ssh para o Debian a partir de algum terminal (putty, solaris dterm, debain xterm, nome-do-it), este recurso de anúncio final (que inclui chaves como Backspace e Tab) via variável de ambiente TERM.

Portanto, após o ssh no host unix (não depende do debian ou de outro host), defina a variável TERM de acordo com o seu terminal. Considere que você está usando o bash como shell e o vt100 como terminal:

export TERM=vt100

O ps: TERM deve ser anunciado via ssh automaticamente, mas em algumas circunstâncias essa mágica falha.


ainda não funciona :(
gopi1410

Qual terminal você está usando? E qual o valor do TERM que você tentou?
paul

Eu tentei vt100. Como conheço o valor de TERM? Eu tentei o ssh do cygwin (no Windows) para o Debian. Se houver problemas com o cygwin, eu até tentei no terminal ubuntu, mas o mesmo problema.
Gopi1410

Não tenho certeza se o cygwin possui uma boa emulação de terminal, tanto quanto eu sei, o cygwin apenas usando o console normal do Windows que não possui emulação de terminal (pode estar errado). No ubuntu, tudo deve funcionar bem. Algo errado com a biblioteca shell ou termcap no debian. Entrada a partir do Ubuntu e dar-me saída de comandos: 1. echo $ TERM 2. stty -a
paul

2
Embora isso não tenha me ajudado diretamente, como o TERM foi definido corretamente, ele ajudou a identificar o problema. Estava faltando as entradas terminfo para o meu terminal. Estou usando o urxvt e, no arch, você precisa instalar o rxvt-unicode-terminfo para corrigir esse problema específico
Xandaros

15

Isso ocorre porque seu shell padrão é sh, para usar bash, apenas executado a bashpartir do seu shell.

bash

Para definir bashcomo seu shell padrão:

chsh -s /bin/bash 

ou

sudo chsh -s /bin/bash yourusername

2
Este corrigiu para mim. Nunca mesmo olhando para o meu shell de login!
James Pack

2
Estou vendo esse problema, mas meu shell é bash.
fraxture

6

Seu shell pode estar definido como em /bin/shvez de/bin/bash


1
Relacionado a esta resposta: unix.stackexchange.com/questions/50542/…
Samuel


Isso seria mais útil se explicasse um pouco mais e como alterá-lo, mas era o problema que eu tinha. Obrigado @ Tom pelo seu link que corrigiu o problema para mim.
21416 Jake

Esta foi a razão no meu caso .. para esse usuário em particular. Nenhum shell foi definido /etc/passwd, quando adicionei :/bin/bashà sua linha que funcionava. Você pode descobrir com o que o shell está sendo usadoecho $0
MSpreij

6

Eu costumo usar isso para corrigir qualquer saída de caracteres descolados no meu terminal. Redefine todos os caracteres especiais para seus valores padrão.

stty sane

Na página de manual stty:

Mesmo que cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon-iexten ecohoho -xcase -tostop -echoprt echoctl echoke, todos os caracteres especiais com seus valores padrão


2

além da resposta de paul, se você deseja manter a capacidade de obter impressões coloridas, pode usar o xterm-88color

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

1
toe -amostra uma lista de tipos de terminal suportados ... xterm-88colorde longe não é a única opção e, de fato, pode não estar disponível em sistemas específicos.
0xC0000022L
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.