2011-10-14 10 views
9

Sto costruendo una finestra di terminale in un browser (come ajaxterm) e non so quale sequenza di escape inviare al tunnel ssh (aperto tramite paramiko.SSHClient().invoke_shell(term='linux')).cos'è la sequenza di escape del terminale per ctrl + freccia (sinistra, destra, ...) in TERM = linux

ho trovato un key logger e provato in un terminale con $ TERM == 'Linux', ma restituisce la stessa sequenza per ctrl+left e left (27,91,68).

Se provo il keylogger in un altro terminale (con $ TERM == 'xterm') ottengo i codici (27,91,49,59,53,68). Ma questi codici non si muovono generano l'output atteso dal canale SSH (che sposterebbe il cursore di una parola a sinistra su una normale shell linux). Questo è vero anche se inizio paramiko con term = 'xterm'.

Qualche idea di quale sequenza dovrei usare? O perché la sequenza sopra non funziona?

UPDATE: Sarei felice di usare un altro tipo di terminale (non "linux"), ma purtroppo pyte opere con terminali VTxxx solo (credo "linux" è terminale VT220-come - in ogni caso, funziona), così xterm non funziona correttamente.

+0

Una tipica configurazione di readline predefinita (bash usa readline) ha 'Alt-B' per ** backward-word **. terminfo non ha nemmeno una voce per 'Ctrl- ←'. – ninjalj

+0

Ma funziona su console xterm ... Potresti dirci di più su terminfo, preferibilmente in una risposta? – johndodo

+0

La console Linux non è nemmeno * vicino * a vt220. È un sottoinsieme di (meno capace) vt100. Ciascuna delle risposte a questa domanda ha almeno un errore. –

risposta

21

I terminali erano dispositivi hardware costituiti da una tastiera e un dispositivo di output (inizialmente una stampante su carta, in seguito un monitor CRT). Un computer di grandi dimensioni potrebbe avere diversi terminali remoti collegati ad esso. Ciascun terminale avrebbe un protocollo per comunicare in modo efficiente con il computer, per i terminali basati su CRT questo include avere speciali "sequenze di controllo" per cambiare posizione del cursore, cancellare parti della linea/schermo corrente, passare a una modalità a schermo intero alternato,. ..

Un emulatore di terminale è un'applicazione che emula uno di quei vecchi terminali. Permette di fare funzioni come il posizionamento del cursore, l'impostazione di colori di primo piano e di sfondo, ... Gli emulatori di terminali cercano di emulare un protocollo specifico, ma ognuno ha il proprio set di stranezze e deviazioni.

I sistemi Unix dispongono di database che descrivono terminali ed emulatori di terminale, pertanto le applicazioni vengono sottratte dal particolare terminale (o emulatore di terminale) in uso. Un database precedente è termcap(5), mentre terminfo(5) è un database più recente. Questi database consentono alle applicazioni di richiedere le funzionalità del terminale in uso. Le funzionalità possono essere booleane, capacità numeriche o anche capacità di stringa, ad esempio: se uno specifico tipo di terminale ha/supporta una chiave F12, avrà una capacità "key_f12" (nome terminfo lungo), "kf12" (nome terminfo breve), "F2" (nome termcap) che descrive la stringa che la chiave produce. Provalo con: tput kf12 | od -tx1.

Dal momento che la programmazione direttamente con funzionalità può essere ingombrante, le applicazioni utilizzano in genere una libreria di livello superiore come maledizioni/ncurses, slang, ecc ...

C'è una variabile d'ambiente speciale chiamato TERM che racconta le applicazioni che tipo terminale stanno parlando. Questa variabile deve essere impostata sul tipo di terminale esatto se esiste nel database, per ottenere i migliori risultati. Questo dice all'applicazione quali protocolli e deviazioni del protocollo precisi capiscono il terminale. La modifica della variabile TERM fa non cambia il tipo di terminale, cambia semplicemente il tipo di terminale con cui l'applicazione pensa di parlare.

Tutto ciò detto, Ctrl+arrow è un comportamento xterm (dipendente da un'opzione di configurazione) che non viene riflessa affatto nei database terminfo/termcap, quindi la maggior parte delle applicazioni non ne sarà a conoscenza. In entrambi i casi, l'emulatore di terminale (nel tuo caso pyte) lo supporta oppure no.

Supponendo che l'applicazione principale è bash o qualche altra applicazione che utilizza la libreria readline, si può farla franca con l'utilizzo di readline backward-word (Meta-b/Alt-b/ESC b per default, configurabile in inputrc), invece.

8

Un rapido controllo con od -c rivela che gnome-termainal genera questi valori:

sinistra-freccia genera ESC-[ - D. geneates

Control-sinistra-array ESC - [ - 1 - ; - 5 - D

+0

Ok, ma gnome-terminal è TERM = xterm ... che dire di linux? – johndodo

+1

La console Linux genera 'ESC'-' ['-'D' per entrambi i tasti. –

+0

Lo so, l'ho scritto così ... :) Ancora, è specifico per la console o per il terminale? – johndodo

4

Il Ctrl + freccia keycodes sono stati introdotti da xterm, e del calibro di Gnome Terminal e KDE Konsole cercano di essere compatibile con xterm . I terminali VT100 e VT220 effettivi non avevano codici chiave separati per tali combinazioni. Per quanto ne so, la console Linux mira a essere compatibile con il VT100, con alcune aggiunte, mentre xterm emula il VT220, con molte aggiunte.

+0

La console Linux ha iniziato a provare a emulare VT100, ma una parte di esso (il passaggio tra i set di caratteri) è stata persa alla fine degli anni '90 quando è stato aggiunto il supporto UTF-8. La console Linux ha implementato i tasti funzione (una funzionalità non inclusa in VT100) basata su VT220 (o l'implementazione xterm nei primi anni '90). A differenza di xterm, la funzione del tasto funzione di Linux non è stata estesa. –

Problemi correlati