target
stdioを介してコマンド/レスポンスインターフェイスを実装するコマンドラインプログラムがあります(人以外のプログラムで動作します)。
具体的には:
- プログラムユーザーがプログラムを開始しました。
- 標準出力(「グリーティング」)から1つ以上の行を読みます。
- 1つ以上の行を標準入力(「コマンド」)に送信します。
- 標準出力から1つ以上の行(「応答」)を読みます。
- ...
これは終了するまでループで発生し、target
一種の「exit」コマンドを受け取ると発生します。
コマンドと応答との間の遅延は任意であり得る。私はそれがそれtarget
自体でいくつかのコマンド(消費者が応答しなければならない)を始めることができると思いますが、私はわかりません。
すべてのコマンドと応答を記録(またはより良い方法で記録および修正)できるように、このプログラムをどのようにラップできますか?
ベストアンサー1
いくつかの家庭から始める必要があります。特に、プログラムの1つは、ターゲットプログラムが前のコマンドへの応答の送信を完了するまでコマンドを送信しません。そうしないと、同時に録音されたコンテンツが乱雑に見えることがあります。この仮定が成立するには、シンクとソースの間に挿入されたプログラムがバッファリングを使用しないようにする必要があります。
2つの解決策:
1.ハウジングFDを含むデュアルTシート
シェルスクリプトはバッファリングを無効にし(このユースケースでは非常に重要です)、クライアントプログラムのstdoutをファイルにtee -a logfile
リダイレクトし、同時にtee
stdoutを一時FDに接続します。
同様に、シェル構成を使用して、クライアントプログラムの標準入力として機能するファイル記述子と、プログラムの標準出力として機能する別のファイル記述子を生成できますtarget
。その後、他のパイプを介して2つの記述子によって形成された「応答」の方向を配管しますtee -a logfile
。
最後に、最初のtee
stdoutストリームを入力として使用しtarget
、2番目のtee
stdinストリームを出力として使用します。
2. プロセスのデバッグ
さまざまな方法を使用して、ターゲットまたはクライアントプロセスが読み書きするものに接続して記録することができます。
適切なLD_PRELOADを使用すると、read
プログラムのstdinおよびstdoutと対話するlibcおよび呼び出しを傍受して記録できます。write
問題:すべてがlibcを使用しているわけではありません。
または、以下が推奨されます。 bpftools は、基本的なシステムコールをキャプチャするリスニングの例を提供します。これを解決する方法はありません。フィルタに表示される内容を記録してください。