web-dev-qa-db-fra.com

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

J'avais essayé la commande cat avec 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?

136
lotusirous

Souvent, dans un terminal Unix/Linux (Bash) par exemple, vous utiliserez les commandes more ou less ou cat pour afficher un fichier. Lorsque vous effectuez cette opération et que le fichier n'est pas destiné à être affiché (tel que /bin/ls) vous obtiendrez une sortie comme celle-ci:

ss of binary output

Ce qui se passe ici, c'est que vous venez d'essayer d'afficher un fichier qui est un programme. Un exécutable qui n'est pas destiné à être vu avec les téléspectateurs standard comme je l'ai mentionné ci-dessus.

méthode # 1 - réinitialiser

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

  1. Appuyez plusieurs fois sur Ctrl + C (Ctrl+C)
  2. Tapez la commande reset et appuyez sur retour

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

méthode # 2 - stty sane

Comme suggéré dans les commentaires de @sendmoreinfo, vous pourriez avoir plus de chance d'utiliser les commandes suivantes à la place si ce qui précède ne fonctionne pas:

$ stty sane
$ tput rs1

déterminer le type d'un fichier

Soit dit en passant, si vous rencontrez un fichier et que vous n'êtes pas sûr qu'il va gâcher votre terminal, vous pouvez inspecter le fichier à l'aide de la commande file qui indiquera le type de fichier qu'il est.

Par exemple, avec /bin/ls ce 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
190
slm

J'ai eu une occasion où aucune des astuces habituelles, reset ou stty sane, a fonctionné (après avoir accidentellement appelé print sur un python bytearray). J'ai réussi avec méthode 2 répertoriée sur ce blog utile .

J'ai depuis créé un alias des plus utiles:

alias fix='echo -e "\033c"'
42
Benjamin Riggs

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

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

puis lorsque le problème se produit, tapez ceci (même si vous ne le voyez probablement pas!)

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

Merci beaucoup aux auteurs précédents. De plus, comme remarque latérale, la raison pour laquelle votre terminal devient bancal lors de l'affichage de ces fichiers exécutables (ou magasins de clés, etc.) est que ces fichiers contiennent souvent des séquences binaires qui sont des codes de contrôle. Les codes de contrôle peuvent faire des choses aléatoires comme passer à un jeu de caractères graphiques, définir les couleurs de premier plan et d'arrière-plan sur la même chose, etc.

12

tmux les utilisateurs peuvent être en mesure d'envoyer toutes ces commandes à leur shell, mais la réinitialisation n'est pas élevée dans le volet tmux.

Créer une nouvelle fenêtre tmux: ctrl-B ctmux list-panes Notez le numéro de volet que vous pensez être falsifié, généralement 0. Appelons ça PPP

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

Vous verrez alors toutes les commandes dans les autres réponses à cette question qui ont atteint votre Shell, mais n'ont pas fonctionné! Peut-être un aveugle tmux send-key -R -t PPP fonctionnera, mais je ne peux pas tester.

4
Jack Wasey

J'ai presque le même alias que le post précédent, avec un petit changement (tput reset au lieu de rs1) et une commande ajoutée (setterm -reset):

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

Rien au-dessus ne m'a aidé. Cependant, Jack Wasey a mentionné tmux, alors j'ai juste lancé tmux, je suis sorti de nouveau et tout était revenu à la normale.

Une autre solution est:

reset
2
xdevs23

Je sais que cela existe depuis un certain temps, mais alors que la plupart des autres réponses ont fonctionné pour moi, réinitialisé, sain d'esprit, parfois aucune de ces réponses n'a fonctionné pour moi et je recourt toujours à:

echo ^v^o

C'est l'écho Ctrl + V suivi de Ctrl + O

0
John L

En plus d'autres réponses indiquant comment réinitialiser le terminal, j'ai pensé que la corruption ne peut être évitée que si elle est correctement protégée. Donc, je ferais mieux d'envoyer la sortie vers un simple convertisseur convivial de texte cat -v:

docker logs myjenkinscontainer 2>&1 | cat -v

La visualisation et l'édition de fichiers binaires semble possible avec hexdump -C et vi -R (:%!xxd -g1 pour une vue hexadécimale et :%!xxd -g1 -r pour enregistrer les modifications hexadécimales).

0
eel ghEEz