Correggi il terminale dopo aver visualizzato un file binario


122

Avevo provato il comando catcon un file eseguibile:

cat /bin/ls

Ora non riesco a leggere nessuna parola in questo terminale (console Linux). Come posso ripararlo?


4
Se ho capito bene, forse il tuo terminale è avvitato; prova a digitare reset.
— Patrice Levesque,


In realtà penso che la risposta qui sia migliore, quindi meglio contrassegnare come
— duplice

Risposte:


165

Spesso quando in un terminale Unix / Linux (Bash), ad esempio, utilizzerai i comandi moreo lesso catper visualizzare un file. Quando lo fai e il file non è pensato per essere visualizzato (come /bin/ls) otterrai un output in questo modo:

                ss di output binario

Quello che sta succedendo qui è che hai appena provato a visualizzare un file che è un programma. Un eseguibile che non è pensato per essere visualizzato con i visualizzatori standard come ho detto sopra.

metodo n. 1: reimpostazione

Per risolvere questo problema è possibile effettuare le seguenti operazioni:

  1. Premi Control + C un paio di volte ( Ctrl+ C)
  2. Digita il comando resete premi Invio

In genere ciò dovrebbe riportare il terminale in una modalità più normale. Citerò un'altra cosa, quando eseguirai i passaggi precedenti, digitandoli ciechi nel tuo terminale. Quindi assicurati di digitarlo correttamente.

metodo # 2 - stty sano

Come suggerito nei commenti di @sendmoreinfo potresti avere più fortuna usando i seguenti comandi se quanto sopra non funziona:

$ stty sane
$ tput rs1

determinare un tipo di file

Per inciso, se ti imbatti in un file e non sei sicuro che rovinerà il tuo terminale, puoi ispezionare il file usando il comando fileche riporterà il tipo di file che è.

Ad esempio, con /bin/lsquel file mostra il seguente output:

$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped

15
resetnon è una cura al 100% per la follia terminale. Prova stty saneseguito da tput rs1.
— sendmoreinfo,

@sendmoreinfo - grazie Ho aggiunto il tuo suggerimento alla risposta. Avevo usato stty sanema mai tput.
— slm

1
in realtà, devo cercare di più. il reset dovrebbe inviare la stringa rs1. Un buon test (almeno per xterm) è rendere invisibile il cursore e vedere se il ripristino lo riporta.
— sendmoreinfo,

4
resetha funzionato nel mio caso
— code_monk

1
clearfunziona anche per casi lievi.
— Navin,

36

Ho avuto un'occasione in cui nessuno dei soliti trucchi, reseto stty sane, ha funzionato (dopo aver richiamato accidentalmente printuno strappo di pitone). Ho avuto successo con il metodo 2 elencato in questo utile blog .

Da allora ho creato un alias molto utile:

alias fix='echo -e "\033c"'

2
So che è vecchio, ma questa è l'unica risposta sopra che ha funzionato per me! Grazie
— jredd

Questo echo -e "\033c"mi ha aiutato a ripulire una sessione terminale di login SSH confusa dai caratteri che è stata confusa dopo un cat /etc/localtime.
— Pro Backup

Questo ha funzionato con OpenBSD, mentre tutti gli altri no.
— Acqua calda sanitaria

1
un'ulteriore sperimentazione con lo schermo (1) ha rilevato che il blocco forzato di tutte le sessioni (-D) quindi l'esecuzione dei comandi di ripristino sullo schermo del terminale sottostante è stato eseguito, potrebbe risolvere il problema. potrebbe anche essere necessario rinominare i nomi delle finestre danneggiati che potrebbero visualizzare nuovamente gli stessi dati binari sul terminale causandone la corruzione (e quindi reimpostare di nuovo).
— matematica

1
Le dimensioni del mio terminale (LINES) sono state dimezzate dopo l'uso di vi durante la connessione alla console di un host Linux remoto tramite SOL. La sessione remota aveva LINES = 24 mentre la mia sessione MAC locale aveva LINES = 51. echo -e "\ 033c" ha funzionato per me, ma nessuna delle altre correzioni che ho provato ha fatto ('stty sane', tput rs1, tput sgr0, reset).
— Segna il

7

Nessuna risposta precedente ha funzionato per me. Ma questo sembra fare il trucco in .bashrc aggiungere:

alias fix='reset; stty sane; tput rs1; clear; echo -e "\033c"'

e quindi quando si verifica il problema, digita questo (anche se probabilmente non riesci a vederlo!)

(ctl-c, ctl-c, ctl-c)
fix

Mille grazie ai precedenti autori. Inoltre, come nota a margine, il motivo per cui il tuo terminale diventa instabile quando mostra quei file eseguibili (o keystore, ecc.) È che quei file spesso contengono sequenze binarie che sono codici di controllo. I codici di controllo possono fare cose casuali come passare a un set di caratteri grafici, impostare i colori di primo piano e di sfondo sulla stessa cosa, ecc.


Lo stesso è successo. Niente ha funzionato per me, solo questa combo ...
— TrueY,

1
Ho chiamato il miosane
— qodeninja il

4

tmuxgli utenti potrebbero essere in grado di inviare tutti questi comandi alla propria shell, ma il ripristino non viene elevato al tmuxriquadro.

Crea una nuova finestra di tmux: ctrl-B c tmux list-panes nota il numero di riquadro che pensi sia corrotto, in genere 0. ChiamiamoloPPP

Seleziona la finestra di tmux, dove si XXXtrova il numero della finestra che è inserito, non necessariamente uguale al numero del riquadro. ctrl-B XXX tmux send-key -R -t PPP

Vedrai quindi tutti i comandi nelle altre risposte a questa domanda che è arrivata alla tua shell, ma non ha funzionato! Forse un cieco tmux send-key -R -t PPPfunzionerà, ma non posso provare.


3

Ho quasi lo stesso alias del post precedente, con una piccola modifica ( tput resetanziché rs1) e un comando aggiunto ( setterm -reset):

alias clr='echo -e "\033c" ; stty sane; setterm -reset; reset; tput reset; clear'

1

Niente sopra mi ha aiutato. Tuttavia, Jack Wasey ha menzionato tmux, quindi sono appena corso tmux, sono uscito di nuovo e tutto è tornato alla normalità.


0

Oltre ad altre risposte che suggeriscono come ripristinare il terminale, ho pensato che la corruzione non potesse essere evitata se non adeguatamente protetta. Quindi è meglio che invii l'output a un semplice convertitore testuale cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

La visualizzazione e la modifica di file binari sembra possibile con hexdump -Ce vi -R( :%!xxd -g1per una vista esadecimale e :%!xxd -g1 -rper salvare le modifiche esadecimali).

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.