私は実行された特定のプロセスがどのファイルとリソースにアクセスしているのかを知る必要があるソフトウェアを開発しています。
すべてのスクリプト、アプリケーション、デーモンがアクセスする内容を追跡するのではなく、ユーザーが提供する特定のプロセスだけを追跡したいと思います。
Python(または他の言語)でこれを行う方法はありますか?私は自分自身のいくつかの調査を行う予定であり、この種のことを知ってより多くの説明を提供できる知識豊富なユーザーがいる場合は、ここに尋ねたいと思いました。
答え1
追跡できますシステムコールプログラムで制作されました。これはアクセスするファイルを見つける一般的な方法です。これを行うためのツールと呼ばれます。truss
多くのUnixシステムではdtruss
OSXではstrace
Linuxで。ここでは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
答え3
完全に信頼できる唯一の方法は、システムコールを追跡することです。strace
@gowenfawrが言及したこのプログラムはこれを正しく行い、ptrace(2)
システムコールの面でもそうします。ただし、このptrace
呼び出しは正しく使用するのが難しいことに注意してください。strace -e open
直接使用できない場合は、2番目の方法を検討してください。
open
ほとんどのプロセスでは、Cライブラリ関数への呼び出しを傍受してこれを実行できますLD_PRELOAD
。これは細かいただし、敵対的なCプログラムではこれを回避できますが、プログラム自体がシステムコールを実行しないと信頼している場合は、プログラミングよりも実装する方が簡単ですptrace
。
高度な言語(Pythonなど)で書かれたプロセスでは、高度な呼び出しを傍受することができますが、open
言語がこれらの傍受をサポートするように設計されていない限り、これはCレベルの呼び出しを傍受するよりも難しいかもしれません(Pythonはそうではありません)。
最後に、上記の段落はすべてファイルが使用されていると仮定します。これは、親から継承された補助データやファイル記述子open
と同様に、常に正しいとは限りません。openat
open64
recvmsg