Wie kann verhindert werden, dass zufällige Konsolenausgaben das Terminal beschädigen?

23

Es gibt viele Fragen zu SE, die zeigen, wie man sich von einem durchgebrochenen Terminal erholt cat /dev/urandom. Für diejenigen, die mit diesem Thema nicht vertraut sind - hier, worum es geht:

  1. Sie führen aus cat /dev/urandomoder äquivalent (zum Beispiel cat binary_file.dat).
  2. Müll wird gedruckt.
  3. Das wäre in Ordnung ... außer, dass Ihr Terminal auch nach Beendigung des Befehls weiterhin Müll druckt ! Hier ist ein Screenshot eines falsch gerenderten Textes, der tatsächlich in g ++ ausgegeben wird:

    Beispiel-Screenshot

    Ich denke, die Leute hatten Recht damit, dass C ++ - Fehler manchmal zu kryptisch sind!

Die übliche Lösung ist das Ausführen stty sane && reset, obwohl es ärgerlich ist, sie jedes Mal auszuführen , wenn dies geschieht.

Aus diesem Grund möchte ich mich in dieser Frage auf den ursprünglichen Grund konzentrieren, warum dies geschieht, und wie verhindert werden kann, dass das Terminal nach der Ausgabe eines solchen Befehls abbricht . Ich bin nicht auf der Suche nach Lösungen wie dem Weiterleiten der beleidigenden Befehle an troder xxd, da dies erfordert, dass Sie wissen, dass das Programm / die Datei Binärdaten ausgibt, bevor Sie sie tatsächlich ausführen / drucken, und dass Sie sich jedes Mal daran erinnern müssen, wenn Sie solche Daten ausgeben .

Ich habe dasselbe Verhalten in URxvt, PuTTY und Linux-Frame-Buffer festgestellt, daher halte ich dies nicht für ein terminalspezifisches Problem. Mein Hauptverdacht besteht darin, dass die Zufallsausgabe einen ANSI-Escape-Code enthält, der die Zeichencodierung umdreht (wenn Sie cat /dev/urandomerneut ausführen , wird das Terminal wahrscheinlich beschädigt , was diese Theorie zu bestätigen scheint). Wenn dies richtig ist, wie lautet dieser Escape-Code? Gibt es Standardmethoden zum Deaktivieren?

rr-
quelle

Antworten:

22

Nein:

  • Es gibt keine Standardmethode zum "Deaktivieren" von und
  • Die Details des Bruchs sind tatsächlich terminal-spezifisch, aber
  • Es gibt einige häufig implementierte Funktionen, bei denen es zu Fehlverhalten kommen kann.

Informationen zu häufig implementierten Funktionen finden Sie im alternativen Zeichensatz im VT100-Stil, der mit ^Nund ^O(Aktivieren / Deaktivieren) aktiviert wird . Das mag in einigen Terminals unterdrückt werden , wenn UTF-8 - Modus verwenden, aber die gleichen Terminals haben reichlich Gelegenheit zum Wegwerfen Ihren Bildschirm (reden über GNU screen, Linux - Konsole, hier PuTTY) mit den Escape - Sequenzen sie tun erkennen.

Einige der anderen Escape-Sequenzen hängen beispielsweise von den Antworten des Terminals auf eine Anfrage (Escape-Sequenz) des Hosts ab. Wenn der Host dies nicht erwartet, wird der Bildschirm als Papierkorb angezeigt.

In anderen Fällen (z. B. bei Netzwerkgeräten mit fest codierten Escape-Sequenzen für die Linux-Konsole) wird dies von anderen Terminals als falsch erkannt und scheint einzufrieren.

Sie könnten sich also auf nur ein Terminal konzentrieren, alles herausschneiden, was als störend empfunden wird (einige schlagen beispielsweise vor, die Möglichkeit zu entfernen, die Maus zum Positionieren in Editoren zu verwenden), und Sie könnten etwas erhalten, das keine offensichtlichen Löcher aufweist. Das ist aber nur ein Terminal.

Thomas Dickey
quelle
0

Wenn Sie die Kontrolle haben und wissen, dass ein Befehl Sie fertig macht, wird die Ausgabe in der Regel in einer Art von weniger angezeigt.

head -n4 /dev/urandom | less

Dieses übliche Verfahren scheint den Müll festzuhalten und mit einer vernünftigen Darstellung zu drucken. Ich hatte nach dem Beenden mit q nie irgendwelche Probleme , an die ich mich erinnere .

ThorSummoner
quelle
2
Die Frage besagt insbesondere, dass er nicht nach Lösungen sucht, bei denen Sie im Voraus wissen müssen, dass das Programm Binärausgaben erzeugt.
Barmar
-1

Leiten Sie die Ausgabe Ihres Befehls usw. in tee -

Brandon
quelle
2
Wie wird das helfen? Die Ausgabe wird weiterhin gedruckt, aber auch in einer Datei gespeichert.
Barmar
Vielleicht meintest du moreoder less?
Barmar
laut OP mit meinem Schwerpunkt: "... nachdem ein solcher Befehl erteilt wurde. Ich suche keine Lösungen wie das Weiterleiten der beleidigenden Befehle"
Jeff Schaller