У меня есть приложение, которое читает файл. Давайте назовем это имя процесса и файл ~ / .configuration . Когда имя процесса запускается, оно всегда читает ~ / .configuration и не может быть настроено иначе. Существуют также другие приложения, которые используют «~ / .configuration» до и после, но не во время выполнения имени процесса .
Обертывание ProcessName в скрипте , который заменяет содержимое ~ / .configuration вариант, но в последнее время у меня был отключение электроэнергии ( в то время как содержимое выгружено), где я потерял предыдущее содержимое указанного файла, так что это не желательно.
Есть ли способ (возможно, использующий что-то отдаленно связанное с LD_DEBUG=files processname
?), Чтобы обмануть процесс при чтении различного содержимого, когда он пытается прочитать конкретный файл? Поиск и замена имени файла в исполняемом файле слишком инвазивны, но также должны работать.
Я знаю, что можно написать модуль ядра, который принимает open()
вызов ( https://news.ycombinator.com/item?id=2972958 ), но есть ли более простой или более чистый способ?
РЕДАКТИРОВАТЬ: При поиске ~ / .configuration в исполняемом файле с именем процесса я обнаружил, что он пытался прочитать другое имя файла прямо перед чтением ~ / .configuration . Задача решена.
источник
LD_PRELOAD
или FUSE, как с этой несколько похожей проблемой , но я не знаю ни одной существующей реализации.Ответы:
В последних версиях Linux вы можете отменить совместное использование пространства имен mount . То есть вы можете запускать процессы, которые по-разному видят виртуальную файловую систему (файловые системы смонтированы по-разному).
Это также можно сделать
chroot
, ноunshare
более адаптировано к вашему случаю.Например
chroot
, вам нужен привилегированный пользователь, привилегированный дляunshare
пространства имен mount.Итак, скажем, у вас есть
~/.configuration
и~/.configuration-for-that-cmd
файлы.Вы можете запустить процесс, для которого
~/.configuration
фактически есть привязка~/.configuration-for-that-cmd
, и выполнитьthat-cmd
там.подобно:
that-cmd
и все его процессы-потомки увидят другое~/.configuration
.that-cmd
выше будет работать какroot
, используйте,sudo -u another-user that-cmd
если это необходимо для запуска в качестве другого пользователя .источник
/test
и он работал без проблем.Мягкие ссылки.
Создайте два файла конфигурации и в большинстве случаев укажите на один из них программную ссылку, но измените программную ссылку, чтобы она указывала на другой при запуске специального приложения.
(Я знаю, что это ужасный взлом, но он немного более надежен, чем изменение содержимого файла).
Или манипулируйте $ HOME.
В сценарии, который запускает раздражающий процесс, установите $ HOME в обычный каталог $ HOME, и ваше приложение должно затем использовать файл конфигурации, расположенный там (проверено и работает для основных команд оболочки, ~ расширяется до $ HOME).
В зависимости от того, что еще делает процесс, изменение $ HOME может иметь непредвиденные последствия (т. Е. Выходные файлы могут оказаться не в том месте).
источник
Вы можете сделать это, используя трюк LD_PRELOAD . Вот реализация, которая отображает пути, начинающиеся с определенного префикса, в другое место. Код также на github .
Например, вы можете подделать существование файла,
/etc/
не будучи пользователем root. Это было необходимо для клиента owncloud, который отказывается работать, когда файл/etc/ownCloud/sync-exclude.list
не существует.Он работает путем переопределения
open()
иopen64()
функции для отображения одного каталога в другой, например , всеopen()
вызовы/etc/ownCloud/...
могут быть перенаправлены/home/user1/.etc/ownCloud/...
.Просто настройте
path_map
, затем скомпилируйте и запустите вашу программу с предустановленной библиотекой lib:Исходный код
path-mapping.c
:источник