スレッドまたはプロセスのファイル アクセスを監視およびリダイレクトする方法はありますか?
たとえば、スレッドが /etc/mysql/my.cnf を読みたいと思っていて、~/my.cnf へのアクセスを変更したい場合や、実行した場合にtouch /etc/test.configファイルを にリダイレクトしたい場合などです~/somefolder/etc/test.config。
Linux/Unix で動作する、できれば C、C++ 用のライブラリを探しています。
前もって感謝します
スレッドまたはプロセスのファイル アクセスを監視およびリダイレクトする方法はありますか?
たとえば、スレッドが /etc/mysql/my.cnf を読みたいと思っていて、~/my.cnf へのアクセスを変更したい場合や、実行した場合にtouch /etc/test.configファイルを にリダイレクトしたい場合などです~/somefolder/etc/test.config。
Linux/Unix で動作する、できれば C、C++ 用のライブラリを探しています。
前もって感謝します
Linux では、バインド マウントを使用してディレクトリまたはファイルを別のパスにマップし、プロセスごとのマウント名前空間を使用して特定のアプリケーションに対してそれを行うことができます。
この質問を参照してください。
例 1:使用する
$ proot -b ~/alternate_hosts:/etc/hosts
# echo '1.2.3.4 google.com' > /etc/hosts
# resolveip google.com
# IP address of google.com is 1.2.3.4
例 2: unshare(1) を使用する
$ unshare -m
# touch foo bar
# mount -o bind foo bar
# echo hello > foo
# cat bar
hello
例 3: unshare(2) を使用する
この投稿を参照してください: http://glandium.org/blog/?p=217 .
プログラムの実行開始時にプリロードされる共有オブジェクトを作成できます。.so では、libc 関数を再定義しますopen()。呼び出し元 (だまされているプログラム) が引数として文字列を渡すと、/etc/mysql/my.cnf代わりに開い~/my.cnfて、開いているファイル記述子を返します。発信者は違いを知りません。
もちろん、共有オブジェクトはopen()ファイルハンドルを開くために「本物」を呼び出す必要があります。を使用して、元の libc 関数へのポインターを取得できますdlsym()。
これは非常に複雑に思えますが、実際にはそうではなく、魔法のように機能します。ソースを持っていないプログラムをだます必要があった場合に、何度か使用しました。時計仕掛けのように機能します。
概念実証を見たい場合は、私が書いたブログをチェックしてください。ハッピーコーディング!