コマンドがアクセスするファイルを正確に知る方法はありますか?

コマンドがアクセスするファイルを正確に知る方法はありますか?

私は実行された特定のプロセスがどのファイルとリソースにアクセスしているのかを知る必要があるソフトウェアを開発しています。

すべてのスクリプト、アプリケーション、デーモンがアクセスする内容を追跡するのではなく、ユーザーが提供する特定のプロセスだけを追跡したいと思います。

Python(または他の言語)でこれを行う方法はありますか?私は自分自身のいくつかの調査を行う予定であり、この種のことを知ってより多くの説明を提供できる知識豊富なユーザーがいる場合は、ここに尋ねたいと思いました。

答え1

追跡できますシステムコールプログラムで制作されました。これはアクセスするファイルを見つける一般的な方法です。これを行うためのツールと呼ばれます。truss多くのUnixシステムではdtrussOSXではstraceLinuxで。ここではLinuxの使い方を説明します。他のシステムのマニュアルを確認してください。

最も単純な形式は

strace myprogram arg1 arg2

これにより、実行されたすべてのシステムコールのログが印刷されますmyprogram。 (はい.) ログをファイルに保存するには、オプションを使用します-o。子プロセスの呼び出しも記録するには、オプションを使用します-f。記録されるシステムコールを選択するには、optionsを使用します-e。利用可能なパラメータの詳細については、マニュアルを参照してください-e。たとえば、次の呼び出しは、およびをread除くファイル関連のシステム呼び出し(開くと閉じる、ディレクトリのリストなど)を記録しますwrite

strace -e'file,!read,!write' -o /tmp/myprogram.log -f myprogram arg1 arg2

答え2

~によるとこの投稿、Pythonで利用可能プスチル基準寸法。 Pythonに限定されない場合ラソフそしてストレスこの目的で最も一般的に使用される2つのコマンドラインユーティリティは次のとおりです。

答え3

完全に信頼できる唯一の方法は、システムコールを追跡することです。strace@gowenfawrが言及したこのプログラムはこれを正しく行い、ptrace(2)システムコールの面でもそうします。ただし、このptrace呼び出しは正しく使用するのが難しいことに注意してください。strace -e open直接使用できない場合は、2番目の方法を検討してください。

openほとんどのプロセスでは、Cライブラリ関数への呼び出しを傍受してこれを実行できますLD_PRELOAD。これは細かいただし、敵対的なCプログラムではこれを回避できますが、プログラム自体がシステムコールを実行しないと信頼している場合は、プログラミングよりも実装する方が簡単ですptrace

高度な言語(Pythonなど)で書かれたプロセスでは、高度な呼び出しを傍受することができますが、open言語がこれらの傍受をサポートするように設計されていない限り、これはCレベルの呼び出しを傍受するよりも難しいかもしれません(Pythonはそうではありません)。

最後に、上記の段落はすべてファイルが使用されていると仮定します。これは、親から継承された補助データやファイル記述子openと同様に、常に正しいとは限りません。openatopen64recvmsg

関連情報