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_PRELOAD
o 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
, perounshare
está más adaptado a su caso.Al igual que
chroot
, necesita superusuario privilegiado paraunshare
el espacio de nombres de montaje.Entonces, digamos que tienes
~/.configuration
y~/.configuration-for-that-cmd
archivos.Puede iniciar un proceso para el cual
~/.configuration
es realmente un montaje de enlace~/.configuration-for-that-cmd
allí, y ejecutarthat-cmd
allí.me gusta:
that-cmd
y todos sus procesos descendientes verán un diferente~/.configuration
.that-cmd
anterior se ejecutará comoroot
, usesudo -u another-user that-cmd
si necesita ejecutarse como otro usuario .fuente
/test
y 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.list
no 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