Перенаправить доступ к файлу
Есть ли способ контролировать и перенаправлять доступ к файлу потока или процесса?
Например, поток хочет прочитать /etc/mysql/my.cnf, и я хочу изменить доступ к ~/my.cnf или, если я запускаю touch /etc/test.config
Я хочу, чтобы файл был перенаправлен на ~/somefolder/etc/test.config
,
Я ищу библиотеку, предпочтительно для C, C++, которая работает для Linux/Unix.
заранее спасибо
2 ответа
В linux вы можете использовать bind mounts для сопоставления каталога или файла с другим путем, а пространства имен монтирования для каждого процесса - для конкретного приложения.
Смотрите этот вопрос.
Пример 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: использовать 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()
,
Это кажется слишком сложным, но на самом деле это не так, это работает как шарм. Я использовал его несколько раз, когда мне приходилось обманывать программу, для которой у меня не было источников; и это просто работает как по маслу.
Если вы хотите увидеть подтверждение концепции, загляните в мой блог, где я ее написал. Удачного кодирования!