Correction du terminal après l'affichage d'un fichier binaire

122

J'avais essayé la commande catavec un fichier exécutable:

cat /bin/ls

Maintenant, je ne peux lire aucun mot dans ce terminal (console Linux). Comment puis-je le réparer?

coup de chance
la source
4
Si je comprends bien, peut-être que votre terminal est foutu; essayez de taper reset.
Patrice Levesque
En fait, je pense que la réponse est meilleure ici, alors mieux vaut marquer comme dupe dans l'autre sens
ilkkachu

Réponses:

165

Souvent, dans un terminal Unix / Linux (Bash), par exemple, vous utilisez les commandes moreou lessou catpour afficher un fichier. Lorsque vous effectuez cette opération et que le fichier n'est pas destiné à être visualisé (tel que /bin/ls), vous obtenez une sortie comme celle-ci:

                ss de sortie binaire

Ce qui se passe ici, c'est que vous venez d'essayer de visualiser un fichier qui est un programme. Un exécutable qui n'est pas destiné à être visionné avec des visualiseurs standard, comme mentionné ci-dessus.

méthode n ° 1 - réinitialiser

Pour résoudre ce problème, vous pouvez procéder comme suit:

  1. Hit Control + C à quelques reprises ( Ctrl+ C)
  2. Tapez la commande resetet appuyez sur Entrée

Cela devrait généralement remettre votre terminal dans un mode plus normal. Je mentionnerai encore une chose, lorsque vous suivrez les étapes ci-dessus, vous les taperez en aveugle dans votre terminal. Assurez-vous simplement que vous le tapez correctement.

méthode n ° 2 - stty sane

Comme suggéré dans les commentaires de @sendmoreinfo, vous aurez peut-être plus de chance en utilisant les commandes suivantes si celles-ci ne fonctionnent pas:

$ stty sane
$ tput rs1

déterminer un type de fichier

Incidemment, si vous tombez sur un fichier et que vous ne savez pas si cela va gâcher votre terminal, vous pouvez inspecter le fichier à l'aide de la commande filequi vous indiquera le type de fichier qu'il contient.

Par exemple, avec /bin/lsce fichier affiche la sortie suivante:

$ 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
slm
la source
15
resetn'est pas un remède à 100% contre la folie terminale. Essayez stty sanesuivi par tput rs1.
sendmoreinfo
@sendmoreinfo - merci, j'ai ajouté votre suggestion à la réponse. J'avais utilisé stty sanemais jamais tput.
slm
1
en fait, j'ai besoin de faire plus de recherches à ce sujet. reset est supposé envoyer une chaîne rs1. Un bon test (pour xterm, au moins) est de rendre le curseur invisible et de voir si reset le ramène.
sendmoreinfo
4
reseta travaillé dans mon cas
code_monk
1
clearfonctionne également pour les cas bénins.
Navin
36

J'ai eu une occasion où aucune des astuces habituelles, resetou n'a stty sanefonctionné (après avoir appelé accidentellement printun bytearray de python). J'ai eu du succès avec la méthode 2 indiquée sur ce blog utile .

J'ai depuis créé un alias très utile:

alias fix='echo -e "\033c"'
Benjamin Riggs
la source
2
Je sais que c'est vieux, mais c'est la seule réponse ci-dessus qui a fonctionné pour moi! Merci
jredd
Cela echo -e "\033c"m'a aidé à nettoyer une session de terminal de connexion SSH déformée qui a été mélangée après un cat /etc/localtime.
Pro Backup
Cela fonctionnait avec OpenBSD, contrairement à tous les autres.
DHW
1
une expérimentation plus poussée avec screen (1) a révélé que le détachage forcé de toutes les sessions (-D), puis l’envoi des commandes de réinitialisation à l’écran du terminal sous-jacent exécuté, pouvaient résoudre le problème. peut également avoir besoin de renommer des noms de fenêtres endommagés susceptibles d'afficher à nouveau les mêmes données binaires sur le terminal, entraînant leur corruption (puis leur réinitialisation).
maths
1
La taille de mon terminal (LINES) a été réduite d'environ la moitié après l'utilisation de vi lors de la connexion à la console d'un hôte linux distant via SOL. La session distante avait LINES = 24 alors que ma session MAC locale avait LINES = 51. echo -e "\ 033c" a fonctionné pour moi, mais aucun des autres correctifs que j'ai essayés ne l’a fait ("stty sane", tput rs1, tput sgr0, reset).
Mark
7

Aucune réponse préalable n'a fonctionné pour moi. Mais cela semblait faire l'affaire dans .bashrc ajoute:

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

et puis quand le problème survient, tapez ceci (même si vous ne pouvez probablement pas le voir!)

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

Merci beaucoup aux auteurs précédents. De plus, en guise de remarque, si votre terminal ne se montre pas optimiste lors de l'affichage de ces fichiers exécutables (ou magasins de clés, etc.), ces fichiers contiennent souvent des séquences binaires qui sont des codes de contrôle. Les codes de contrôle peuvent effectuer des opérations aléatoires, telles que basculer vers un jeu de caractères graphiques, définir les mêmes couleurs pour le premier plan et l'arrière-plan, etc.

Steven le facilement amusé
la source
Même arrivé. Rien n'a fonctionné pour moi, juste ce combo ...
TrueY
1
J'ai appelé monsane
qodeninja
4

tmuxles utilisateurs peuvent peut-être envoyer toutes ces commandes dans leur shell, mais la réinitialisation n'est pas élevée dans le tmuxvolet.

Créer une nouvelle fenêtre tmux: ctrl-B c tmux list-panes Notez généralement le numéro de la sous-fenêtre que vous pensez être bouché 0. Appelons çaPPP

Sélectionnez la fenêtre tmux, où XXXest le numéro de la fenêtre qui est borkée, pas nécessairement le même que le numéro du volet. ctrl-B XXX tmux send-key -R -t PPP

Vous verrez alors toutes les commandes dans les autres réponses à cette question qui a été insérée dans votre shell, mais n'a pas fonctionné! Peut-être qu'un aveugle tmux send-key -R -t PPPfonctionnera, mais je ne peux pas tester.

Jack Wasey
la source
3

J'ai presque le même alias que le post précédent, avec une petite modification ( tput resetau lieu de rs1) et une commande supplémentaire ( setterm -reset):

alias clr='echo -e "\033c" ; stty sane; setterm -reset; reset; tput reset; clear'
Cyril Chaboisseau
la source
1

Rien ci-dessus m'a aidé. Cependant, Jack Wasey a mentionné tmux, alors je me suis précipité tmux, je suis sorti à nouveau et tout était rentré dans l'ordre.

xdevs23
la source
0

En plus d’autres réponses vous indiquant comment réinitialiser le terminal, j’ai pensé que la corruption ne pouvait être évitée que si elle était bien gardée. Il est donc préférable d’envoyer la sortie à un simple convertisseur de texte cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

La visualisation et l'édition de fichiers binaires semblent possibles avec hexdump -Cet vi -R( :%!xxd -g1pour une vue hexadécimale et :%!xxd -g1 -rpour l'enregistrement des modifications hexadécimales).

anguille
la source