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.