Determinando o diretório home de um usuário

3

Eu preciso saber como o diretório home de um usuário do Linux é determinado. A resposta de todos seria "ei, olhe para /etc/passwd e descubra". Mas isso parece não estar sempre correto. Veja isto:

$ whoami
test
$ cat /etc/passwd
test:x:2000:2000::/home/test:/bin/bash  (relevant line)
$ echo ~
/root
$ cd
bash: cd: /root: No such file or directory

Eu realmente não tenho ideia do que está acontecendo. É um subsistema que entrei como root por chroot --userspec=test path/to/subsystem/ /bin/bash . Alguém sabe o que é isso e como corrigi-lo para que ~ se expanda para /home/test e cd funcione como esperado?

    
por karlosss 20.10.2017 / 01:14

1 resposta

5

A pesquisa em /etc/passwd está correta para contas de usuários locais (a menos que o administrador do sistema tenha se esforçado para dificultar as coisas). A resposta geral correta é procurar no banco de dados do usuário que contém a conta do usuário, por exemplo, LDAP. A maioria dos sistemas modernos usa NSS para listar os bancos de dados de usuários, então verifique /etc/nsswitch.conf no seu sistema se você acha que pode haver contas não locais.

Do ponto de vista de um aplicativo, a resposta correta é que o diretório inicial é qualquer que seja a variável de ambiente HOME .

Programas de login ( login , sshd , X gerenciadores de exibição, etc.) normalmente configuram a variável de ambiente HOME para o diretório inicial do usuário que está efetuando login. Programas de alteração de usuário de “alto nível”, como su e sudo change HOME para (com sudo, isso depende da configuração e das opções da linha de comandos). Então, normalmente, a definição para “diretório inicial do usuário atual” corresponde à combinação de “diretório pessoal do usuário” e “usuário atual”.

Mas chroot não muda HOME , portanto, sua sessão no chroot é herdada da variável de ambiente HOME no processo pai, o que não é surpresa /root . No bash, como qualquer outro shell, ~ se expande para o valor de HOME , padronizando a consulta do banco de dados do usuário se HOME não estiver definido.

Solução: desatualizado HOME .

env -u HOME chroot --userspec=test path/to/subsystem/ /bin/bash
    
por 20.10.2017 / 01:51