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.

gopi1410
fonte

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.

Derui Si
fonte
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.

Paulo
fonte
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
chama de gelo
fonte
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

jm.
fonte
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

David Morales
fonte
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
beenotung
fonte
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