Tengo una aplicación que lee un archivo. Llamémoslo nombre de proceso y el archivo ~ / .configuration . Cuando se ejecuta processname , siempre lee ~ / .configuration y no se puede configurar de manera diferente. También existen otras aplicaciones que se basan en "~ / .configuration", antes y después, pero no mientras ProcessName se está ejecutando.
Envoltura ProcessName en una secuencia de comandos que sustituye el contenido de ~ / .configuration es una opción, pero recientemente he tenido un corte de energía (mientras que los contenidos fueron cambiados), donde perdí el contenido anterior de dicho fichero, así que esto no es deseable.
¿Hay alguna manera (tal vez usando algo relacionado con algo distante LD_DEBUG=files processname) para engañar a un proceso a leer diferentes contenidos cuando intenta leer un archivo específico? Buscar y reemplazar el nombre del archivo en el ejecutable es un poco invasivo, pero debería funcionar también.
Sé que es posible escribir un módulo de kernel que se haga cargo de la open()llamada ( https://news.ycombinator.com/item?id=2972958 ), pero ¿hay alguna forma más simple o más limpia?
EDITAR: Al buscar ~ / .configuration en el ejecutable del nombre del proceso , descubrí que intentaba leer otro nombre de archivo justo antes de leer ~ / .configuration . Problema resuelto.
fuente

LD_PRELOADo FUSE, como con este problema algo similar , pero no conozco ninguna implementación existente.Respuestas:
En versiones recientes de Linux, puede dejar de compartir el espacio de nombres de montaje . Es decir, puede iniciar procesos que vean el sistema de archivos virtual de manera diferente (con sistemas de archivos montados de manera diferente).
Eso también se puede hacer
chroot, perounshareestá más adaptado a su caso.Al igual que
chroot, necesita superusuario privilegiado paraunshareel espacio de nombres de montaje.Entonces, digamos que tienes
~/.configurationy~/.configuration-for-that-cmdarchivos.Puede iniciar un proceso para el cual
~/.configurationes realmente un montaje de enlace~/.configuration-for-that-cmdallí, y ejecutarthat-cmdallí.me gusta:
that-cmdy todos sus procesos descendientes verán un diferente~/.configuration.that-cmdanterior se ejecutará comoroot, usesudo -u another-user that-cmdsi necesita ejecutarse como otro usuario .fuente
/testy funcionó sin problemas.Enlaces blandos.
Cree dos archivos de configuración y apunte a uno de ellos con un enlace suave la mayor parte del tiempo, pero cambie el enlace suave para que apunte al otro cuando se esté ejecutando la aplicación especial.
(Sé que este es un truco horrible, pero es un poco más confiable que cambiar el contenido del archivo).
O manipule $ HOME.
En el script que inicia el proceso molesto, configure $ HOME como algo bajo el directorio normal $ HOME, y su aplicación debería usar el archivo de configuración ubicado allí (probado y funciona para comandos básicos de shell, ~ se expande a $ HOME).
Dependiendo de qué más haga el proceso, cambiar $ HOME puede tener consecuencias no deseadas (es decir, los archivos de salida pueden terminar en el lugar equivocado).
fuente
Puedes hacer esto usando el truco LD_PRELOAD . Aquí hay una implementación que asigna rutas que comienzan con un prefijo específico a otra ubicación. El código también está en github .
Por ejemplo, podría fingir la existencia de un archivo
/etc/sin ser root. Esto era necesario para el cliente owncloud que se niega a trabajar cuando el archivo/etc/ownCloud/sync-exclude.listno existe.Funciona anulando las funciones
open()yopen64()para asignar un directorio a otro, por ejemplo, todas lasopen()llamadas a/etc/ownCloud/...se pueden redirigir a/home/user1/.etc/ownCloud/....Simplemente ajuste el
path_map, luego compile y ejecute su programa con la biblioteca precargada:Código fuente de
path-mapping.c:fuente