Force o telnet / ssh a usar crtl-H para backspace

9

Eu tenho alguns dispositivos conectados a um servidor de termo serial da Cisco; muitos funcionam bem quando eu telnetdiretamente na porta da Cisco. No entanto, tenho alguns dispositivos teimosos que não serão usados Backspace, pois são mapeados no telnet por padrão.

Caso isso importe, eu faço telnet rxvtno Debian squeeze (em uma janela X). TERMestá definido para rxvt, mas não importa se eu usar vt100, vt101ou xterm... mudando TERMnão tem efeito. Comecei no caminho da mudança com TERMbase no que vi em uma antiga FAQ do Kermit . FWIW stty erase ^he stty erase ^?também não funciona.

Eu notei que Backspacefunciona corretamente nesses dispositivos se eu usar um soquete TCP bruto de netcat... ie nc 192.168.12.117 2006; no entanto, encontro outros problemas com senhas não ocultas ou paginação de terminal.

Como posso forçar seletivamente telnet e SSH para mapear Backspacea CtrlHpara esses dispositivos? Além disso, quais critérios devo usar para avaliar se isso é um bug no dispositivo?

EDITAR

Caso isso importe, essa é a saída de showkey -apara as chaves em questão ... ^?corresponde a Backspacee ^Hé CtrlH. Parece que eu deveria estar chegando perto quando olho no Howto sobre teclado e console do Linux , mas não consigo decifrar o que posso fazer para mudar isso. Eu tentei vários encantamentos loadkeyssem 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 resultados relevantes dumpkeystambém ... este é o mapeamento atual no meu sistema (que não funciona em alguns dispositivos em questão). Se eu conseguisse descobrir como Backspacefazer a mesma coisa CtrlH, 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]$
Mike Pennington
fonte
11
Você já tentou ssty erase '^?'? Se os dispositivos insistirem em um C-h, não é a chamada do telnet, é o terminal (emulador).
Gilles 'SO- stop be evil'
@Gilles seu comentário não é realmente correto, veja minha resposta abaixo
Mike Pennington

Respostas:

10

Finalmente encontrei uma resposta no Linux Keyboard Hall of Shame de Anne Baretta ... parece que alterar o mapeamento de teclas em xterm/ rxvtnão serve para nadatelnet .

Eu validei isso quando cheirei a conexão telnet. Primeiro cheirei a sessão de telnet e vi que foi Backspaceenviada 0x7fao host. Em seguida eu quebrou intencionalmente Backspaceem rxvtusar stty erase $(mapeando assim o meu Backspace para o cifrão no rxvt). Depois de fazer isso, tive que pressionar $para voltar atrás rxvt, mas telnetainda enviei 0x7fquando usei Backspaceno host remoto.

SOLUÇÃO

Crie um script chamado kbdfix(abaixo) e torne-o executável com 755permissões; você precisará dos pacotes tclshe expectcarregados dos 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 {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

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

Observe para qualquer pessoa confusa em 2006 acima ... que é a porta TCP que o servidor de termos da Cisco usa para a conexão serial ao console do dispositivo quebrado (neste caso, um comutador Brocade FCX).

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

Mike Pennington
fonte
2
stty erase $não mapeia a chave "backspace" para "$", informa ao driver tty que, para apagar um caracter, a chave "$" precisa ser usada. Ao executar o telnet, você está no modo bruto, portanto, essa configuração é ignorada. Uma solução simples seria configurar o seu emulador de terminal para enviar ^ H para backspace, como Deus pretendia, outro está usando seu hack, que traduz esses caracteres em tempo real usando expect.
Jlliagre
@ jlliagre, sim, eu descobri como as sttyalterações telnetde teclado não eram usadas quando eu usava wireshark; no entanto, esse fato importante não estava claro para mim até eu cheirar. Vou investigar como posso alterar o Backspace para usar Control_hem rxvt... ou talvez precise pensar em encontrar outro termo.
Mike Pennington #
@ Mike: Eu acho que você ainda está confuso sobre alguma coisa (que eu admito nem jlliagre nem mencionei explicitamente; atualizei minha resposta). sttyprecisa ser executado no lado do aplicativo. Duvido muito que telnetesteja traduzindo caracteres de entrada ou que você precisa usar script; apenas rodar sttyna máquina remota provavelmente fará o truque.
Gilles 'SO- stop be evil'
@Gilles, a máquina remota é um dispositivo de rede, não possui stty.
Mike Pennington
11
@ Mike: Quando você usa o netcat, seu terminal está no modo cozido: você escreve uma linha, edita-a localmente e a Enterenvia. Quando você usa o telnet, seu terminal está no modo bruto: cada caractere é enviado imediatamente ao aplicativo. Veja, por exemplo, o início desta página ou este artigo da Wikipedia .
Gilles 'SO- stop be evil'
3

Backspace e Control-H foram projetados para serem a mesma coisa, mas hoje em dia, especialmente no Linux, você geralmente tem backspace enviando delete e delete enviando alguma sequência de escape estranha.

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

jlliagre
fonte
Sua pergunta é baseada na suposição de que o telnet está executando um processamento específico da chave de backspace que acredito estar errado. Eu deveria ter colocado isso como um comentário em vez de uma resposta de fato.
Jlliagre 19/05
AFAICT, telnetnão presta atenção aos mapeamentos de terminais locais do teclado. Notas de Anne Barreta sobre o teclado e telnet
Mike Pennington
Receio que você esteja entendendo mal o que o stty faz.
Jlliagre 19/05
3

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

Se você efetuar logon remotamente (com telnet, rsh ou ssh) dentro do terminal, observe que você deve executar stty no lado do aplicativo . sttynão diz ao terminal para fazer algo diferente, ele informa o driver do terminal local (isto é, a parte que faz interface com os 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 o Screen ou um software terminal a terminal semelhante, precisará executar sttyem cada janela da tela (mas geralmente o Screen pode ser configurado para fazer a coisa certa a partir do arquivo de configuração, se não funcionar imediatamente )

A diferença de comportamento observada em relação a netcatvs. telnetse deve à maneira como o terminal é usado: * No netcat, o terminal está no modo linha por linha (também chamado de "modo cozido"). Você edita uma linha (usando o recurso de edição interna do terminal local e, em particular, as configurações stty locais) e envia-a em seu estado final ao host remoto. * No telnet, o terminal (local) está no modo caractere a caractere (também chamado de "modo bruto"). Cada pressionamento de tecla vai diretamente para o telnet, que o transmite imediatamente para o sistema remoto. Você depende dos recursos de edição de linha do sistema remoto.

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

Com o xterm, é fácil: existe uma configuração para alternar o caractere enviado pela BackSpacetecla no tempo de execução. No menu do botão esquerdo, alterne "Excluir é DEL". Programaticamente, envie a sequência de escape \e[?67h para BackSpaceenviar ^hou \e[?67lpara BackSpaceenviar ^?. O recurso correspondente é XTerm.backarrowKeyIsErase. Outros emuladores de terminal podem ou não ter um recurso de interface semelhante ou suportar a sequência de escape.

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

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

Gilles 'SO- parar de ser mau'
fonte