2015-02-01 5 views
1

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

Например нить хочет прочитать /etc/mysql/my.cnf, и я хочу, чтобы изменить доступ к ~/my.cnf или если я бегу touch /etc/test.config Я хочу, чтобы файл, который будет перенаправлен на ~/somefolder/etc/test.config.

Я ищу библиотеку, предпочтительно для C, C++, которая работает для Linux/Unix.

Заранее спасибо

+0

Предполагая, что дескриптор файла доступен из обоих потоков, вы можете закрыть старый дескриптор, открыть новый дескриптор и использовать 'dup2()' – user590028

+0

'ln -s /etc/mysql/my.cnf ~/my.cnf' ? –

+0

Проблема в том, что я хочу получать доход от других программ и не знаю, к чему они будут обращаться. Кроме того, крайне важно, чтобы они не получали никакой информации из файла, который они изначально запрашивали. Это должно быть нечто вроде песочницы. – Koogle

ответ

1

Вы могли бы написать общий объект, который получает предварительно загруженный, когда программа начинает работать. В .so вы переопределили функцию libc open(). Когда вызывающий (программа, обманутая) передает в качестве аргумента строку /etc/mysql/my.cnf, вместо этого вы откроете ~/my.cnf и вернете открытый дескриптор файла. Вызывающий не знал бы разницы.

Ваш общий объект, разумеется, должен был бы вызвать «реальный» open(), чтобы открыть дескриптор файла; вы можете получить указатель на исходную функцию libc, используя dlsym().

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

Если вы хотите увидеть доказательство концепции, ознакомьтесь с my blog, где я его написал. Счастливое кодирование!

+0

Я проверю это, но на деле это швы, как чрезмерно сложные. – Koogle

+0

Я должен добавить, что это работает на всех уровнях. Например, если вы предварительно загрузите свой стандартный Bash этим общим объектом, тогда все программы наследуют ваше перенаправление. Итак, выполняете ли вы «cat /etc/my.cnf» или «vi /etc/my.cnf», или запускаете ли вы какую-либо другую программу, которая обращается к /etc/my.cnf: все будут перенаправлены на любой файл, который у вас есть в уме. –

+0

Хорошо, я буду глубже смотреть на него, чтобы я мог просмотреть ваш ответ. – Koogle

1

В linux вы можете использовать привязки монтирования для отображения каталога или файла на другой путь и пространства имен для каждого процесса, чтобы сделать это для конкретного приложения.

См. this вопрос.

Пример 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)

Смотрите этот ро st: http://glandium.org/blog/?p=217.

Смежные вопросы