Forza telnet / ssh a usare crtl-H per il backspace


9

Ho alcuni dispositivi collegati a un server a termine seriale Cisco; molti funzionano bene quando vado telnetdirettamente alla porta su Cisco. Tuttavia, ho alcuni dispositivi testardi che non useranno Backspacepoiché è mappato in Telnet per impostazione predefinita.

Se è importante, telnet da rxvtsotto Debian squeeze (in una X Window). TERMè impostato rxvt, ma non importa se io uso vt100, vt101o xterm... la modifica TERMnon ha alcun effetto. Ho iniziato la strada del cambiamento in TERMbase a ciò che ho visto in una vecchia FAQ di Kermit . FWIW, stty erase ^he stty erase ^?non funziona neanche.

Ho notato che Backspacefunziona correttamente su questi dispositivi se uso un socket TCP non elaborato da netcat... ie nc 192.168.12.117 2006; tuttavia, mi imbatto in altri problemi con password non nascoste o paginazione del terminale.

Come posso forzare selettivamente Telnet e SSH per mappare Backspacea CtrlHper questi dispositivi? Inoltre, quali criteri devo usare per valutare se si tratta di un bug nel dispositivo?

MODIFICARE

Nel caso sia importante, questo è l'output di showkey -aper le chiavi in ​​questione ... ^?corrisponde Backspaceed ^Hè CtrlH. Sembra che dovrei avvicinarmi quando guardo The Linux Keyboard and Console Howto , ma non riesco a decifrare cosa posso fare per cambiarlo. Ho provato vari incantesimi loadkeyssenza alcun effetto.

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

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

Sto includendo anche l'output pertinente da dumpkeys... questa è la mappatura corrente nel mio sistema (che non funziona su alcuni dispositivi in ​​questione). Se riuscissi a capire come fare Backspaceper fare la stessa cosa CtrlH, avrei una soluzione.

[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]$

1
Ci hai provato ssty erase '^?'? Se i dispositivi insistono su a C-h, non è la chiamata di Telnet, è il terminale (emulatore).
Gilles 'SO- smetti di essere malvagio'

@Gilles il tuo commento in realtà non è corretto, vedi la mia risposta di seguito
Mike Pennington,

Risposte:


10

Ho finalmente trovato una risposta nella Linux Keyboard Hall of Shame di Anne Baretta ... sembra che cambiare la mappatura dei tasti in xterm/ rxvtnon sia utiletelnet .

L'ho convalidato quando ho annusato la connessione telnet. Prima ho annusato la sessione di telnet e ho visto che è stato Backspaceinviato 0x7fall'host. Poi ho volutamente rotto Backspacein rxvtutilizzando stty erase $(mappatura così il mio Backspace per il simbolo del dollaro in rxvt). Dopo aver fatto questo, ho dovuto colpire il $backspace rxvt, ma ho telnetancora inviato 0x7fquando l'ho usato Backspacesull'host remoto.

SOLUZIONE

Crea uno script chiamato kbdfix(sotto) e rendilo eseguibile con le 755autorizzazioni; avrai bisogno dei pacchetti tclshe expectcaricati dai tuoi archivi di distribuzione.

#!/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"}
}

Ora per connettermi agli host danneggiati, scrivo kbdfix telnet 192.168.12.117 2006e Backspacefunziona.

Nota per chiunque sia confuso dal 2006 sopra ... questa è la porta TCP che il term server Cisco utilizza per la connessione seriale alla console del dispositivo rotto (in questo caso, uno switch Brocade FCX).

Se stai semplicemente effettuando una chiamata su un dispositivo che non ti piace Backspace, lo utilizzeresti kbdfix telnet <addr_of_the_broken_device>. Lo sto usando anche con ssh quando ssh su uno switch Ethernet DLink DGS-3200 che ha problemi simili; la sintassi è kbdfix ssh 172.16.1.26.


2
stty erase $non esegue il mapping del tasto "backspace" su "$", indica al driver tty che per cancellare un carattere è necessario utilizzare il tasto "$". Quando si esegue telnet, ci si trova in modalità raw, quindi questa impostazione viene ignorata. Una soluzione semplice sarebbe quella di configurare il tuo emulatore di terminale per inviare ^ H per il backspace, come Dio intendeva, un altro sta usando il tuo hack che traduce questi personaggi al volo usando wait.
jlliagre,

@jlliagre, sì, ho scoperto come sttynon sono cambiate telnetle letture della tastiera quando l'ho usato wireshark; tuttavia, questo fatto importante non mi è stato chiaro fino a quando non ho annusato. Studierò come posso cambiare Backspace per usarlo Control_hin rxvt... o forse dovrei pensare a trovare un altro termine.
Mike Pennington,

@Mike: penso che tu sia ancora confuso su qualcosa (che non ammetto né jlliagre né ho menzionato esplicitamente; ho aggiornato la mia risposta). sttydeve essere eseguito sul lato dell'applicazione. Dubito fortemente telnetche stai traducendo caratteri di input o che devi usare script; semplicemente eseguendo sttysul computer remoto probabilmente farà il trucco.
Gilles 'SO- smetti di essere malvagio'

@Gilles, la macchina remota è un dispositivo di rete, non ha stty.
Mike Pennington,

1
@Mike: quando usi netcat, il tuo terminale è in modalità Cotto: scrivi una linea, la modifichi localmente e la Entermandi. Quando usi telnet, il tuo terminale è in modalità raw: ogni personaggio viene inviato immediatamente all'applicazione. Vedi ad esempio l'inizio di questa pagina o questo articolo di Wikipedia .
Gilles 'SO- smetti di essere malvagio'

3

Backspace e Control-H sono stati progettati per essere la stessa cosa, ma al giorno d'oggi, specialmente su Linux, spesso si ha backspace che invia e cancella inviando una sequenza di escape dispari.

In ogni caso e per quanto ne so, telnet o la variabile TERM non dovrebbero cambiare ciò che invia backspace, questa è di solito una funzione di configurazione dell'emulatore di terminale.


La tua domanda si basa sul presupposto che telnet stia eseguendo un'elaborazione specifica della chiave backspace che ritengo errata. Avrei dovuto metterlo come commento invece che come risposta.
jlliagre,

AFAICT, telnetnon presta attenzione alle mappature dei terminali locali della tastiera. Note di Anne Barreta sulla tastiera e sul telnet
Mike Pennington,

Temo che tu abbia frainteso ciò che fa stty.
jlliagre,

3

I programmi dovrebbero interrogare le impostazioni del terminale per scoprire qual è il carattere di backspace ( ^he ^?, cioè \010e \177, sono le due scelte là fuori). Usa stty erase '^h'o stty erase '^?'per dichiarare ciò che invia il tuo terminale.

Se si accede in remoto (con telnet, rsh o ssh) all'interno del terminale, tenere presente che è necessario eseguire stty sul lato dell'applicazione . sttynon dice al terminale di fare qualcosa di diverso, informa il driver del terminale locale (cioè la parte che si interfaccia con le applicazioni in esecuzione nel terminale) sulle impostazioni del terminale (storicamente un oggetto fisico, ora un emulatore di terminale). Allo stesso modo, se si esegue Screen o un simile software terminal-in-terminal, è necessario eseguire sttyin ogni finestra dello schermo (ma di solito Screen può essere configurato per fare la cosa giusta dal suo file di configurazione, se non funziona immediatamente ).

La differenza di comportamento che si osserva da netcatvs. telnetè dovuta al modo in cui viene utilizzato il terminale: * In netcat, il terminale è in modalità linea per linea (anche chiamata “modalità cotta”). Modifichi una linea (usando la funzione di edizione integrata del terminale locale, e quindi in particolare le impostazioni stty locali), quindi la invii nel suo stato finale all'host remoto. * In telnet, il terminale (locale) è in modalità carattere per carattere (chiamato anche "modalità raw"). Ogni sequenza di tasti passa direttamente a Telnet che lo inoltra immediatamente al sistema remoto. Sei dipendente dalle funzioni di edizione della linea del sistema remoto.

Esistono programmi interrotti che non si preoccupano delle impostazioni del terminale. Sembra che tu abbia incontrato uno di loro. La soluzione migliore è cambiare la configurazione del tuo terminale. Lo stesso vale se è necessario comunicare con un dispositivo tramite un protocollo remoto come telnet o SSH e il dispositivo non è configurabile.

Con xterm è semplice: esiste un'impostazione per attivare o disattivare il personaggio inviato dalla BackSpacechiave in fase di esecuzione. Dal menu del pulsante sinistro, attiva "Elimina è CANC". A livello di codice, inviare la sequenza di escape \e[?67h per l' BackSpaceinvio ^ho \e[?67lper l' BackSpaceinvio ^?. La risorsa corrispondente è XTerm.backarrowKeyIsErase. Altri emulatori di terminale possono o meno avere una funzione di interfaccia simile o supportare la sequenza di escape.

Molti emulatori di terminale inviano uno ^ho ^?quando si preme BackSpacee l'altro carattere quando si preme Ctrl+ BackSpace. Questo può essere utile in un pizzico.

Nota che gli showkeysamici sono rilevanti solo sulla console Linux, non su X.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.