substituindo a localização HOME

2

Gostaria de substituir localmente a localização HOME do usuário em um script para forçar um aplicativo a armazenar / carregar suas configurações de forma portável.

export HOME=$TMPDIR/Data
export XDG_CONFIG_HOME=$TMPDIR/Data

Isso funciona na maioria dos casos, mas há alguns aplicativos que ainda encontram o caminho inicial "real".

Por que meu método de substituir a localização HOME do usuário não funciona?

    
por eadmaster 04.07.2013 / 00:10

2 respostas

2

Infelizmente, isso depende muito do seu aplicativo. Existem várias maneiras de um aplicativo poder vislumbrar o diretório pessoal de um usuário.

  1. $HOME

    Você já está ciente disso. $HOME é uma variável de ambiente que pode ser substituída por meio da configuração de login. arquivos como .bashrc ou .bash_profile em um ambiente Bash. O valor geralmente é algo como /home/username .

  2. /home/$USER

    Eu consideraria essa uma variante de $HOME , mas encontrei aplicativos que tolamente supõem que o diretório pessoal de um usuário precisa estar em /home , então eles adicionam a variável $USER e a usam.

  3. analisando /etc/passwd

    Este é provavelmente o pior ofensor em termos da pior maneira de obter o diretório pessoal de um usuário, mas muitas ferramentas e scripts fazem isso dessa maneira. A maioria deles é uma variação de algo como isso, onde eles usam o comando getent :

    $ getent passwd | grep $1 | awk -F: '{ print $6 }'
    
    # for example (user "saml")
    $ getent passwd | grep saml | awk -F: '{ print $6 }'
    /home/saml
    

    O "banco de dados" back-end que armazena as informações do usuário pode ser qualquer coisa, desde o arquivo /etc/passwd até o NIS, até um banco de dados LDAP.

  4. GTK & g_get_home_dir()

    A biblioteca GTK fornece uma API, g_get_home_dir() , que extrairá informações do usuário do backend "passwd" em vez de usar $HOME .

    trecho de Referência do GLib Manual

    Note that in contrast to traditional Unix tools, this function prefers passwd entries over the HOME environment variable.

  5. KDE

    O KDE parece fazer uso do $ HOME. Primeiro, ele procurará KDEHOME , voltando para $HOME/.kde se isso não estiver definido.

    excerto Administração do sistema do KDE / Hierarquia do sistema de arquivos do KDE

    This directory tree is, as the name suggests, normally located in the user's home directory. If this environment variable is not defined, the default location $HOME/.kde4 is used.

por 04.07.2013 / 04:13
1

Existem duas maneiras de obter o diretório pessoal do usuário atual.

  • Uma maneira é examinar a entrada passwd do usuário (em /etc/passwd ).
  • Outra maneira é observar a variável ambiental HOME . $HOME é realmente definido a partir da entrada passwd. Aplicativos que podem configurá-lo incluem seu emulador de terminal, seu gerenciador de login e sudo.

Os aplicativos que você não consegue enganar podem estar olhando para a entrada passwd do usuário. Também é possível que eles estejam armazenando o diretório pessoal do usuário em algum lugar (possivelmente como parte de um caminho absoluto para algum arquivo ou diretório) e ignorando tanto HOME quanto a entrada passwd.

Uma maneira de verificar se um aplicativo usa a variável de ambiente HOME é procurar por ele. Por exemplo, grep HOME /usr/bin/pdftex retornará Binary file /usr/bin/pdftex matches , o que significa que pdftex pode usar $HOME .

Para respostas mais definidas, examine o código-fonte do aplicativo.
Use grep -r 'getenv\s\?(.*HOME' para acelerar um pouco a análise do código-fonte.

    
por 04.07.2013 / 00:20