有没有办法来监控和重定向线程或进程的文件访问?
例如,一个线程想读/etc/mysql/my.cnf,我想改变接入到〜/ my.cnf中,或者如果我跑touch /etc/test.config
我想要的文件被重定向到~/somefolder/etc/test.config
。
我要寻找最好的C,C一libary ++该工程的Linux / Unix。
提前致谢
有没有办法来监控和重定向线程或进程的文件访问?
例如,一个线程想读/etc/mysql/my.cnf,我想改变接入到〜/ my.cnf中,或者如果我跑touch /etc/test.config
我想要的文件被重定向到~/somefolder/etc/test.config
。
我要寻找最好的C,C一libary ++该工程的Linux / Unix。
提前致谢
你可以写你的程序开始运行时被预加载的共享对象。 在。所以你会重新定义的libc函数open()
当呼叫方(即是越来越上当的程序)通过作为参数字符串/etc/mysql/my.cnf
,你最好别打开~/my.cnf
,返回打开的文件描述符。 来电者不会知道其中的差别。
当然,你的共享对象就需要调用“真正” open()
来打开文件句柄; 您可以通过获得一个指向原来的libc函数dlsym()
这似乎过于复杂,但其实它不是,它就像一个魅力。 我已经使用了好几次,我不得不傻瓜,我没有足够的资源用于方案; 它简单地就像上了发条。
如果你想看到一个概念证明,看看我的博客 ,我写了起来。 编码愉快!
在Linux中,你可以使用绑定安装来映射目录或文件到其他路径,并且每个进程挂载命名空间做了具体的应用。
见这个问题。
实施例1:使用PROOT
$ 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:使用取消共享(1)
$ unshare -m
# touch foo bar
# mount -o bind foo bar
# echo hello > foo
# cat bar
hello
实施例3:使用取消共享(2)
看到这个帖子: http://glandium.org/blog/?p=217 。