web-dev-qa-db-ja.com

安全な猫はいますか?

時々、curlまたはローカルファイルシステムのいずれかからバイナリをキャットすることがあります。ほとんどの場合、壊れた端末は reset で修正できます。その他の場合、特にバイナリが大きい場合、端末は次のように出力を印刷するために数分間スタックします。

2c1

aka

c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;
2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;2c1;

このシナリオに関して3つの質問があります。

  1. 2c1の意味と、端末がこれを印刷するのはなぜですか?
  2. catを実際に見て、インタラクティブなセッションでこの望ましくない動作を防止しましたか?
  3. そのような猫をプログラムする方法について何か提案がありますか(ceeまたはgolangで)

私の最初の本能は、これを検出する関数で猫を包むことでしたが、正しく理解するのはかなり難しく、多くのエッジケースがあることにすぐに気付きました。

function cat() {
    # warn user if
    #   - argument 1 is a large  executable 
    #   - argument 1 to the previous command in the a pipe-chain looks like a large binary
    # abort if
    #   - session is interactive and we are able to detect 2c1 garbage
}

実用的な解決策は、「安全でない」入力を確認するときに(LESSPIPEを使用して)常に使用量を減らすことですが、この質問はポケットベルに関するものではありません。私はますますパイプが少なくなっていることに気づいています。毎日積極的に使っています。おそらく、less + lesspipeがこの問題の解決策であり、lessの作成者が20〜30年前に同じ問題に直面している

ただし、猫は複数の点で「ポケットベル」とは異なります...主に猫は非対話型です。これは私にとって重要です。

Less + lesspipeに関する提案は、実用的には非常に優れていますが(imho)、制御文字の要点、特別なエスケープシーケンス、およびさまざまな端末がこれらの入力を処理する方法に関心があります。

私は、制御文字の技術的な本質的な詳細と、端末またはシェルが「ガベージ」と制御文字をどのように解釈するかにもっと興味があります。私は「この問題をどのように解決しますか」とは尋ねていません。 「なぜこのようなバイナリファイルを処理する端末なのか」と尋ねています。

代わりにlessを使用します。これは、バイナリファイルを警告し、一部のシステムではさまざまな種類を処理できます(eg CentOS 7では、less file.rpmを実行して次のファイルを確認できます。 RPM)。それは「レスパイプ」と呼ばれていると思います。

また、次回この問題が発生した場合は、stty saneを試して通常に戻すことができます。

4