Comment empêcher une sortie de console aléatoire de casser le terminal?

23

Il y a beaucoup de questions sur SE qui montrent comment récupérer du terminal cassé cat /dev/urandom. Pour ceux qui ne connaissent pas ce problème - voici de quoi il s'agit:

  1. Vous exécutez cat /dev/urandomou équivalent (par exemple, cat binary_file.dat).
  2. Les ordures sont imprimées.
  3. Ce serait bien ... sauf que votre terminal continue d'imprimer les ordures même après la fin de la commande! Voici une capture d'écran d'un texte mal rendu qui est en fait une sortie g ++:

    Exemple de capture d'écran

    Je suppose que les gens avaient raison sur le fait que les erreurs C ++ sont parfois trop cryptiques!

La solution habituelle consiste à exécuter stty sane && reset, même si c'est un peu ennuyeux de l'exécuter à chaque fois que cela se produit.

Pour cette raison, ce sur quoi je veux me concentrer dans cette question est la raison initiale pour laquelle cela se produit et comment empêcher le terminal de se casser après l'émission d'une telle commande. Je ne cherche pas de solutions telles que le transfert des commandes incriminées vers trou xxd, car cela nécessite que vous sachiez que le programme / fichier génère des données binaires avant de l'exécuter / l'imprimer, et doit être mémorisé chaque fois que vous produisez de telles données. .

J'ai remarqué le même comportement dans URxvt, PuTTY et Linux frame buffer, donc je ne pense pas que ce soit un problème spécifique au terminal. Mon principal suspect est que la sortie aléatoire contient du code d'échappement ANSI qui inverse l'encodage des caractères (en fait, si vous exécutez à cat /dev/urandomnouveau, il y a de fortes chances que cela brise le terminal, ce qui semble confirmer cette théorie). Si c'est vrai, quel est ce code d'échappement? Existe-t-il des moyens standard de le désactiver?

rr-
la source

Réponses:

22

Non:

  • il n'y a aucun moyen standard de le "désactiver", et
  • les détails de la rupture sont en fait spécifiques au terminal, mais
  • il existe des fonctionnalités couramment implémentées pour lesquelles vous pouvez obtenir un comportement incorrect.

Pour les fonctionnalités couramment implémentées, consultez le jeu de caractères alternatif de style VT100, qui est activé par ^Net ^O(activer / désactiver). Cela peut être supprimé dans certains terminaux en utilisant le mode UTF-8, mais les mêmes terminaux ont amplement l' occasion pour bousiller votre écran (parle écran GNU, Linux console, PuTTY ici) avec les séquences d'échappement qu'ils ne reconnaissent.

Certaines des autres séquences d'échappement, par exemple, dépendent des réponses du terminal à une requête (séquence d'échappement) de l'hôte. Si l'hôte ne s'y attend pas, le résultat est une corbeille à l'écran.

Dans d'autres cas (vu par exemple dans les périphériques réseau avec des séquences d'échappement codées en dur pour la console Linux), d'autres terminaux verront cela comme mal codé et semblent se figer.

Donc ... vous pouvez vous concentrer sur un seul terminal, tailler tout ce qui ressemble à une nuisance (comme par exemple, certains suggèrent de supprimer la possibilité d'utiliser la souris pour le positionnement dans les éditeurs), et vous pourriez obtenir quelque chose qui n'a pas de trous apparents. Mais ce n'est qu'un terminal.

Thomas Dickey
la source
0

Si vous contrôlez et que vous savez qu'une commande va vous gâcher, je vais généralement voir la sortie dans quelque chose comme moins.

head -n4 /dev/urandom | less

Cette habitude semble capturer les ordures et les imprimer avec une représentation saine, je n'ai jamais eu de problème, je me souviens après être sorti avec q , que j'incase au cas où vous n'êtes pas familier avec moins d'arrêter.

ThorSummoner
la source
2
La question dit spécifiquement qu'il ne cherche pas de solutions qui nécessitent que vous sachiez à l'avance que le programme produit une sortie binaire.
Barmar
-1

Canalisez la sortie de votre commande, etc. dans tee -

brandon
la source
2
Comment cela va-t-il aider? Il imprimera toujours la sortie, mais l'enregistrera également dans un fichier.
Barmar
Peut-être que tu voulais dire moreou less?
Barmar
par l'OP avec mon accent: "... après qu'une telle commande soit émise. Je ne cherche pas de solutions telles que la tuyauterie des commandes incriminées"
Jeff Schaller