Como forçar relativo a ser absoluto no Linux?

Como forçar relativo a ser absoluto no Linux?

Eu tenho um software de terceiros com configuração externa que usa "caminho para arquivo" como parâmetro de entrada. Infelizmente, este software concatena o caminho fornecido com algum caminho predefinido. Por exemplo, ele espera 'data/images' como parâmetro e usará '/Users/someuser/work/source/data/images'. Quero especificar um caminho absoluto, mas fornecer algo como '/tmp/images' para este software resultará apenas no caminho inexistente '/Users/someuser/work/source//tmp/images' sendo usado :(. É algum truque de caminho que posso usar junto com '..' para poder fornecer um software somethingque resultará em um caminho absoluto depois que o software o concatena com um predefinido. Usar '..' funciona, mas não é uma solução muito boa, pois a configuração do caminho é estática e predefinida. o caminho de uso do software pode mudar.

Responder1

Existem inúmeras possibilidades de /Users/someuser/work/source/XXXapontar para onde você quiser no Linux:

  • Use links simbólicos - fazendo algo como:

    ln -s /wherever/you/want /Users/someuser/work/source/XXX
    

    faria /Users/someuser/work/source/XXXaparecer como um diretório. Se algum software viajasse para lá e/ou gravasse arquivos lá, eles acabariam no formato /wherever/you/want.

  • Monte algum outro sistema de arquivos XXX, ou seja

    mount /dev/something /Users/someuser/work/source/XXX
    

    Dessa forma, você terá seu dispositivo /dev/something montado diretamente no diretório no qual o aplicativo gravaria.

  • Faça uma "montagem de ligação", ou seja, religue uma parte de algum outro sistema de arquivos (já montado) para XXX:

    mount -o bind /wherever/you/want /Users/someuser/work/source/XXX
    

    Funciona como um link simbólico, mas é muito mais difícil de detectar pelo aplicativo. O aplicativo pode facilmente verificar se o diretório de destino é um link simbólico e recusar a gravação nele, enquanto o método bind mount fornece um diretório normal, mas seu conteúdo seria

  • Use um sistema de arquivos semelhante ao unionfs, comosindicatoouaufs- desta forma você pode "unificar", ou seja, montar simultaneamente vários sistemas de arquivos em um diretório (ou seja, XXX)

  • Faça alguns truques com LD_PRELOAD e bibliotecas que substituem métodos, como open(), fopen(), etc - o mais proeminente éfusível, ou seja, você pode querer verificarSistemas de arquivos tipo Union para FUSE.

Responder2

Se você criar um link simbólico /Users/someuser/work/source/para /(root)

work$ ln -s / source

Cada caminho será baseado na raiz:

/Users/someuser/work/source/tmp/images 

apontará para

/tmp/images

que você pode verificar por

work$ ls source/tmp/images

informação relacionada