Redirect file access

柔情痞子 提交于 2019-12-13 02:27:43

问题


Is there a way to monitor and redirect file access of a thread or process?

For example a thread wants to read /etc/mysql/my.cnf and I want to change the access to ~/my.cnf or if I run touch /etc/test.config I want the file to be redirected to ~/somefolder/etc/test.config.

I am looking for a libary preferably for C, C++ which works for Linux/Unix.

Thanks in advance


回答1:


You could write a shared object that gets pre-loaded when your program starts running. In the .so you'd redefine the libc function open(). When the caller (the program that's getting fooled) passes as argument the string /etc/mysql/my.cnf, you'd instead open ~/my.cnf and return the opened file descriptor. The caller wouldn't know the difference.

Your shared object would of course need to call the "real" open() to to open the file handle; you can get a pointer to the original libc function using dlsym().

This seems overly complicated, but in fact it isn't, it works like a charm. I've used it on several occasions where I had to fool a program that I didn't have the sources for; and it simply works like a clockwork.

If you want to see a proof of concept, check out my blog where I wrote it up. Happy coding!




回答2:


In linux, you can use bind mounts to map directory or file to another path, and per-process mount namespaces to do it for specific application.

See this question.

Example 1: use 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

Example 2: use unshare(1)

$ unshare -m
# touch foo bar
# mount -o bind foo bar
# echo hello > foo
# cat bar
hello

Example 3: use unshare(2)

See this post: http://glandium.org/blog/?p=217.



来源:https://stackoverflow.com/questions/28261972/redirect-file-access

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!