Come impedire che l'output casuale della console rompa il terminale?


23

Ci sono molte domande su SE che mostrano come recuperare dal terminale rotto cat /dev/urandom. Per coloro che non hanno familiarità con questo problema, ecco di cosa si tratta:

  1. Esegui cat /dev/urandomo equivalente (ad esempio, cat binary_file.dat).
  2. L'immondizia è stampata.
  3. Andrebbe bene ... tranne che il tuo terminale continua a stampare immondizia anche dopo che il comando è terminato! Ecco uno screenshot di un testo errato che in effetti è l'output di g ++:

    Schermata di esempio

    Immagino che la gente avesse ragione sugli errori C ++ a volte troppo criptici!

La solita soluzione è eseguire stty sane && reset, anche se è un po 'fastidioso eseguirlo ogni volta che succede.

Per questo motivo , ciò su cui voglio concentrarmi in questa domanda è il motivo originale per cui ciò accade e come impedire che il terminale si rompa dopo che tale comando è stato emesso. Non sto cercando soluzioni come reindirizzare i comandi offensivi tro xxd, perché ciò richiede che tu sappia che il programma / file emette binario prima di eseguirlo / stamparlo effettivamente e deve essere ricordato ogni volta che ti capita di generare tali dati .

Ho notato lo stesso comportamento in URxvt, PuTTY e il frame buffer di Linux, quindi non penso che questo sia un problema specifico del terminale. Il mio principale sospetto è che l'output casuale contenga un codice di escape ANSI che inverte la codifica dei caratteri (in effetti, se si esegue di cat /dev/urandomnuovo, è probabile che si spezzerà il terminale, il che sembra confermare questa teoria). Se questo è giusto, qual è questo codice di escape? Esistono modi standard per disabilitarlo?

Risposte:


22

No:

  • non esiste un modo standard per "disabilitarlo" e
  • i dettagli della rottura sono in realtà specifici del terminale, ma
  • ci sono alcune funzionalità comunemente implementate per le quali è possibile ottenere comportamenti scorretti.

Per le funzionalità comunemente implementate, consultare il set di caratteri alternativi in ​​stile VT100, che è attivato da ^Ne ^O(abilita / disabilita). Che può essere soppresso in alcuni terminali quando si utilizza la modalità UTF-8, ma gli stessi terminali hanno ampie possibilità di cestinare il vostro schermo (si parla di schermo GNU, Linux console, PuTTY qui) con le sequenze di escape che non riconoscono.

Alcune delle altre sequenze di escape, ad esempio, si basano sulle risposte del terminale a una query (sequenza di escape) da parte dell'host. Se l'host non se lo aspetta, il risultato è cestino sullo schermo.

In altri casi (visto ad esempio nei dispositivi di rete con sequenze di escape hardcoded per la console Linux), altri terminali lo vedranno come errato e sembrano bloccarsi.

Quindi ... potresti concentrarti su un solo terminale, eliminare qualsiasi cosa sembri un fastidio (come ad esempio, alcuni suggeriscono di rimuovere la possibilità di usare il mouse per il posizionamento negli editor) e potresti ottenere qualcosa che non ha buchi apparenti. Ma questo è solo un terminale.


0

Se hai il controllo e sai che un comando ti rovinerà, di solito visualizzerò l'output in qualcosa di meno.

head -n4 /dev/urandom | less

Questo solito sembra catturare la spazzatura e stamparla con una rappresentazione sana, non ho mai avuto problemi che ricordo dopo essere uscito con q , il che in grassetto non ha familiarità con la tua dimissione di meno.


2
La domanda dice specificamente che non sta cercando soluzioni che richiedono di sapere in anticipo che il programma produce output binario.
Barmar,

-1

Installa l'output del tuo comando, ecc. In tee -


2
Come sarà d'aiuto? Stamperà comunque l'output, ma lo salverà anche in un file.
Barmar,

Forse volevi dire moreo less?
Barmar,

secondo il PO con la mia enfasi: "... dopo che tale comando è stato emesso. Non sto cercando soluzioni come il piping dei comandi offensivi"
Jeff Schaller
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.