Força telnet / ssh a usar o crtl-H para backspace

7

Eu tenho alguns dispositivos conectados a um servidor de termo serial da Cisco; muitos funcionam bem quando eu telnet diretamente para a porta no Cisco. No entanto, tenho alguns dispositivos teimosos que não usam o Backspace como ele é mapeado no telnet por padrão.

Caso seja importante, eu faço o telnet de rxvt sob o squeeze Debian (em um X Window). TERM está definido como rxvt , mas não importa se eu uso vt100 , vt101 ou xterm ... alterar TERM não tem efeito. Comecei a mudar a estrada de mudar TERM com base no que eu vi em uma antiga Kermit FAQ . FWIW, stty erase ^h e stty erase ^? também não funcionam.

Eu notei que Backspace funciona corretamente nesses dispositivos se eu usar um soquete TCP bruto de netcat ... ou seja, nc 192.168.12.117 2006 ; no entanto, eu me deparo com outros problemas com senhas não escondidas ou paginação terminal.

Como posso seletivamente forçar o telnet e o ssh a mapear Backspace para Ctrl H para esses dispositivos? Além disso, que critérios devo usar para avaliar se isso é um bug no dispositivo?

EDITAR

Caso seja importante, esta é a saída de showkey -a para as chaves em questão ... ^? corresponde a Backspace e ^H é Ctrl H . Parece que eu deveria estar chegando perto quando eu olhar para O Teclado Linux e o Howto de Console , mas não consigo decifrar o que posso fazer para mudar isso. Eu tentei vários encantamentos com loadkeys sem efeito.

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^H        8 0010 0x08

Também estou incluindo a saída relevante de dumpkeys também ... este é o mapeamento atual em meu sistema (que não funciona em alguns dispositivos em questão). Se eu conseguisse descobrir como fazer o Backspace fazer o mesmo que Ctrl H , eu teria uma solução.

[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =
[mpenning@hotcoffee docs]$
    
por Mike Pennington 18.05.2011 / 22:18

3 respostas

7

Eu finalmente encontrei uma resposta no Teclado Linux de Shame da Anne Baretta ... parece que alterar os mapeamentos de teclas em xterm / rxvt não é bom para telnet .

Eu validei isso quando cheirei a conexão telnet. Primeiro eu cheirei a sessão de telnet e vi que Backspace enviou 0x7f para o host. Em seguida, intencionalmente, quebrei Backspace em rxvt usando stty erase $ (mapeando meu Backspace para o cifrão em rxvt ). Depois de fazer isso, tive que pressionar $ para retroceder em rxvt , mas telnet ainda enviou 0x7f quando usei Backspace no host remoto.

SOLUÇÃO

Crie um script chamado kbdfix (abaixo) e torne-o executável com 755 permissions; você precisará dos pacotes tclsh e expect carregados de seus arquivos de distribuição.

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 7        {send "0"}
 "3\[3~"  {send "7"}
}

Agora para conectar-se aos hosts quebrados, eu digito kbdfix telnet 192.168.12.117 2006 e Backspace funciona.

Nota para qualquer um confuso em 2006 acima ... que é a porta TCP que o servidor de termos Cisco usa para a conexão serial com o console do dispositivo quebrado (nesse caso, um comutador Brocade FCX).

Se você está meramente telnetando para um dispositivo que não gosta de Backspace , você usaria kbdfix telnet <addr_of_the_broken_device> . Eu também estou usando isso com ssh quando eu ssh para um switch Ethernet DLink DGS-3200 que tem problemas semelhantes; a sintaxe é kbdfix ssh 172.16.1.26 .

    
por 19.05.2011 / 15:20
2

Backspace e Control-H foram projetados para ser a mesma coisa, mas hoje em dia, especialmente no Linux, muitas vezes você tem backspace enviando delete e delete enviando uma estranha seqüência de escape.

Em qualquer caso e até onde eu sei, o telnet ou a variável TERM não deve mudar o que o backspace envia, este é geralmente um recurso de configuração do emulador de terminal.

    
por 18.05.2011 / 22:42
2

Os programas devem consultar as configurações do terminal para descobrir qual é o caractere de retrocesso ( ^h e ^? , ou seja, 0 e 7 , são as duas opções disponíveis). Use stty erase '^h' ou stty erase '^?' para declarar o que seu terminal envia.

Se você efetuar login remotamente (com telnet, rsh ou ssh) dentro do terminal, observe que você deve executar stty no lado do aplicativo . stty não diz ao terminal para fazer algo diferente, informa o driver do terminal local (ou seja, a parte que faz interface com aplicativos em execução no terminal) sobre as configurações do terminal (historicamente um objeto físico, agora um emulador de terminal). Da mesma forma, se você executar um software Screen-in-terminal ou similar, você precisará executar stty em cada janela de tela (mas normalmente a Tela pode ser configurada para fazer a coisa certa em seu arquivo de configuração, se não funcionar da caixa).

A diferença de comportamento que você observa de netcat vs. telnet é devido à maneira como o terminal é usado: * No netcat, o terminal está no modo line-by-line (também chamado de “modo cozido”). Você edita uma linha (usando o recurso de edição embutida do terminal local e, em particular, as configurações stty locais), depois a envia em seu estado final para o host remoto. * No telnet, o terminal (local) está no modo caractere por caractere (também chamado de “modo bruto”). Cada tecla pressionada vai diretamente para o telnet, que a retransmite imediatamente para o sistema remoto. Você depende dos recursos de edição de linha do sistema remoto.

Existem programas quebrados que não se importam com as configurações do terminal. Parece que você encontrou um deles. Sua melhor aposta é mudar a configuração do seu terminal. O mesmo acontece se você precisar se comunicar com um dispositivo através de um protocolo remoto, como telnet ou SSH, e o dispositivo não for configurável.

Com o xterm, é fácil: há uma configuração para alternar o caractere enviado pela tecla BackSpace em tempo de execução. No menu do botão esquerdo, alterne “Delete is DEL”. Programaticamente, envie a sequência de escape \e[?67h para ter BackSpace send ^h ou \e[?67l para ter BackSpace envia ^? . O recurso correspondente é XTerm.backarrowKeyIsErase . Outros emuladores de terminal podem ou não ter um recurso de interface semelhante ou suportar a seqüência de escape.

Muitos emuladores de terminal enviam um ^h ou ^? quando você pressiona BackSpace e o outro caractere quando você pressiona Ctrl + BackSpace . Isso pode ser útil em uma pitada.

Observe que showkeys e amigos são relevantes apenas no console do Linux, não no X.

    
por 19.05.2011 / 01:06