Перенаправить доступ к файлу

Есть ли способ контролировать и перенаправлять доступ к файлу потока или процесса?

Например, поток хочет прочитать /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(),

Это кажется слишком сложным, но на самом деле это не так, это работает как шарм. Я использовал его несколько раз, когда мне приходилось обманывать программу, для которой у меня не было источников; и это просто работает как по маслу.

Если вы хотите увидеть подтверждение концепции, загляните в мой блог, где я ее написал. Удачного кодирования!

Другие вопросы по тегам