Eu tenho um aplicativo que lê um arquivo. Vamos chamá-lo processname e o arquivo ~ / .configuration . Quando processname é executado, ele sempre lê ~ / .configuration e não pode ser configurado de maneira diferente. Também existem outros aplicativos que contam com "~ / .configuration", antes e depois, mas não enquanto o nome do processo está em execução.
Embrulhar processname em um script que substitui o conteúdo de ~ / .configuration é uma opção, mas recentemente tive uma queda de energia (enquanto o conteúdo foi trocado), onde perdi o conteúdo anterior do arquivo, portanto, isso não é desejável.
Existe uma maneira (talvez usando algo relacionado à distância LD_DEBUG=files processname
?) Para enganar um processo para ler conteúdos diferentes quando ele tenta ler um arquivo específico? Pesquisando e substituindo o nome do arquivo no executável é um pouco invasivo, mas também deve funcionar.
Eu sei que é possível escrever um módulo do kernel que assume a open()
chamada ( https://news.ycombinator.com/item?id=2972958 ), mas existe uma maneira mais simples ou mais limpa?
EDIT: Ao procurar ~ / .configuration na processname executável eu descobri que ele tentou ler um outro direito filename antes de ler ~ / .configuration . Problema resolvido.
fonte
LD_PRELOAD
ou FUSE, como com esse problema um pouco semelhante , mas não conheço nenhuma implementação existente.Respostas:
Nas versões recentes do Linux, você pode cancelar o compartilhamento do espaço para nome da montagem . Ou seja, você pode iniciar processos que visualizam o sistema de arquivos virtual de maneira diferente (com sistemas de arquivos montados de maneira diferente).
Isso também pode ser feito
chroot
, masunshare
é mais adaptado ao seu caso.Assim
chroot
, você precisa de um superusuário privilegiadounshare
no espaço para nome da montagem.Então, diga que você tem
~/.configuration
e~/.configuration-for-that-cmd
arquivos.Você pode iniciar um processo para o qual
~/.configuration
é realmente uma montagem de ligação~/.configuration-for-that-cmd
lá e executarthat-cmd
lá.gostar:
that-cmd
e todos os seus processos descendentes terão uma visão diferente~/.configuration
.that-cmd
acima será executado comoroot
, usesudo -u another-user that-cmd
se precisar ser executado como outro usuário .fonte
/test
e funcionou sem problemas.Links flexíveis.
Crie dois arquivos de configuração e aponte para um deles com um link flexível na maioria das vezes, mas altere o link flexível para apontar para o outro quando o aplicativo especial estiver em execução.
(Eu sei que esse é um truque horrível, mas é um pouco mais confiável do que alterar o conteúdo do arquivo).
Ou manipule $ HOME.
No script que inicia o processo irritante, defina $ HOME como algo no diretório $ HOME normal, e seu aplicativo deve usar o arquivo de configuração localizado lá (testado e funciona com comandos básicos do shell, ~ expande para $ HOME).
Dependendo do que mais o processo faz, a alteração de $ HOME pode ter consequências indesejadas (ou seja, os arquivos de saída podem acabar no lugar errado).
fonte
Você pode fazer isso usando o truque LD_PRELOAD . Aqui está uma implementação que mapeia os caminhos que começam com um prefixo específico para outro local. O código também está no github .
Por exemplo, você pode falsificar a existência de um arquivo
/etc/
sem ser root. Isso foi necessário para o cliente owncloud que se recusa a trabalhar quando o arquivo/etc/ownCloud/sync-exclude.list
não existe.Ele funciona substituindo as funções
open()
eopen64()
para mapear um diretório para outro, por exemplo, todas asopen()
chamadas para as quais/etc/ownCloud/...
podem ser redirecionadas/home/user1/.etc/ownCloud/...
.Basta ajustar
path_map
, compilar e executar o seu programa com a lib pré-carregada:Código fonte de
path-mapping.c
:fonte