web-dev-qa-db-ja.com

ランダムなコンソール出力が端末を壊すのを防ぐ方法は?

SEには、cat /dev/urandomによって壊れた端末から回復する方法を示す多くの質問があります。この問題に慣れていない人のために-ここでそれが何であるか:

  1. cat /dev/urandomまたは同等のもの(たとえば、cat binary_file.dat)を実行します。
  2. ゴミがプリントされています。
  3. それは問題ありません...あなたの端末がafterでもゴミを印刷し続けることを除いて、コマンドは終了しました!以下は、実際にはg ++出力である誤ってレンダリングされたテキストのスクリーンショットです。

    Example screenshot

    C++のエラーが時々不可解であることに人々は正しかったと思います!

通常の解決策はstty sane && resetを実行することですが、これが発生するたびに実行するのはちょっと面倒です。

そのため、この質問で焦点を当てたいのは元の理由これが発生する理由と、端末が壊れないようにする方法ですそのようなコマンドが発行された後。問題のコマンドをtrまたはxxdにパイプするなどの解決策を探していません。これは、実際に実行/印刷する前にプログラム/ファイルがバイナリを出力することを知っている必要があるためです。このようなデータを出力するたびに覚えておく必要があります。

URxvt、PuTTY、Linuxのフレームバッファーでも同じ動作に気づいたので、これは端末固有の問題ではないと思います。私の主な疑いは、ランダム出力に文字エンコードを反転するANSIエスケープコードが含まれていることです(実際、cat /dev/urandomを再度実行すると、可能性が高いですnbreak端末、この理論を確認してください)。これが正しい場合、このエスケープコードは何ですか?それを無効にする標準的な方法はありますか?

23
rr-

番号:

  • 「無効にする」ための標準的な方法はありません。
  • 破損の詳細は実際には端末固有ですが、
  • 一般的に実装されている機能のうち、動作が不正になる可能性があるものがあります。

一般的に実装される機能については、^Nおよび^O(有効/無効)によってアクティブ化されるVT100スタイルの代替文字セットを参照してください。一部の端末ではUTF-8モードを使用すると抑制される可能性がありますが、同じ端末ではエスケープシーケンスを使用して画面を破壊する十分な機会があります(GNU画面、Linuxコンソール、PuTTYについて))彼らはdo認識します。

たとえば、他のエスケープシーケンスの一部は、ホストからのターミナルからクエリ(エスケープシーケンス)への応答に依存しています。ホストがそれを期待しない場合、結果は画面上のゴミになります。

その他の場合(たとえば、Linuxコンソールのハードコードされたエスケープシーケンスを備えたネットワークデバイスで見られる)、他の端末は、誤ってコーディングされていると認識し、フリーズしているように見えます。

だから...あなたは1つの端末だけに焦点を当てることができ、迷惑のように見えるものをすべて削除します(たとえば、エディターでの配置にマウスを使用する機能を削除することを提案します)、明らかに穴のないものを取得する可能性があります。しかし、それはたった1つの端末です。

22
Thomas Dickey

あなたの管理下にあり、コマンドがあなたを台無しにすることを知っているなら、私は通常より少ないもので出力を見るでしょう。

head -n4 /dev/urandom | less

これは通常、ゴミをキャプチャして正気な表現で印刷するようですが、qで終了するを思い出しても問題はありませんでした。

0
ThorSummoner