Eu tenho alguns dispositivos conectados a um servidor de termo serial da Cisco; muitos funcionam bem quando eu telnet
diretamente 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 rxvt
no Debian squeeze (em uma janela X). TERM
está definido para rxvt
, mas não importa se eu usar vt100
, vt101
ou xterm
... mudando TERM
não tem efeito. Comecei no caminho da mudança com TERM
base no que vi em uma antiga FAQ do Kermit . FWIW stty erase ^h
e 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 -a
para 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 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 resultados relevantes dumpkeys
també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]$
ssty erase '^?'
? Se os dispositivos insistirem em umC-h
, não é a chamada do telnet, é o terminal (emulador).Respostas:
Finalmente encontrei uma resposta no Linux Keyboard Hall of Shame de Anne Baretta ... parece que alterar o mapeamento de teclas em
xterm
/rxvt
nã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
0x7f
ao host. Em seguida eu quebrou intencionalmente Backspaceemrxvt
usarstty erase $
(mapeando assim o meu Backspace para o cifrão norxvt
). Depois de fazer isso, tive que pressionar $para voltar atrásrxvt
, mastelnet
ainda enviei0x7f
quando usei Backspaceno host remoto.SOLUÇÃO
Crie um script chamado
kbdfix
(abaixo) e torne-o executável com755
permissões; você precisará dos pacotestclsh
eexpect
carregados dos seus arquivos de distribuição.Agora, para conectar-se aos hosts quebrados, digito
kbdfix telnet 192.168.12.117 2006
e 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
.fonte
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.stty
alteraçõestelnet
de teclado não eram usadas quando eu usavawireshark
; no entanto, esse fato importante não estava claro para mim até eu cheirar. Vou investigar como posso alterar o Backspace para usarControl_h
emrxvt
... ou talvez precise pensar em encontrar outro termo.stty
precisa ser executado no lado do aplicativo. Duvido muito quetelnet
esteja traduzindo caracteres de entrada ou que você precisa usarscript
; apenas rodarstty
na máquina remota provavelmente fará o truque.stty
.Enter
envia. 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 .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.
fonte
telnet
não presta atenção aos mapeamentos de terminais locais do teclado. Notas de Anne Barreta sobre o teclado e telnetOs programas devem consultar as configurações do terminal para descobrir qual é o caractere de backspace (
^h
e^?
, ie ,\010
e\177
, são as duas opções disponíveis). Usestty erase '^h'
oustty 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 .stty
nã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á executarstty
em 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
netcat
vs.telnet
se 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^h
ou\e[?67l
para 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
^h
ou^?
quando você pressiona BackSpacee 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.fonte