Como obter HOME, dado USER?

30

Eu tenho uma variável USER no meu script e quero ver o caminho HOME com base na variável USER . Como eu posso fazer isso?

    
por MatthewRock 05.12.2015 / 18:41

5 respostas

59

Existe um utilitário que procura informações do usuário, independentemente de essas informações estarem armazenadas em arquivos locais, como /etc/passwd ou no LDAP ou outro método. É chamado getent .

Para obter informações do usuário, você executa getent passwd $USER . Você receberá uma linha que parece:

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

Agora você pode simplesmente cortar o diretório inicial, por exemplo, usando corte, assim:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
    
por 05.12.2015 / 18:50
9

Você pode usar eval para obter o diretório pessoal de alguém.

eval echo "~$USER"

Pelo menos para usuários locais, isso funciona com certeza. Não sei se usuários remotos como o LDAP são tratados com eval .

    
por 05.12.2015 / 18:58
2

O local habitual é /home/$USER , mas isso não precisa ser universal. O local definitivo para procurar essas informações está dentro do arquivo /etc/passwd .

Esse arquivo é legível por todos (qualquer pessoa pode lê-lo), então qualquer usuário tem acesso ao seu conteúdo.
Se o $ USER existir no arquivo, a entrada anterior ao último é o diretório HOME do usuário.

Isso selecionará a entrada e imprimirá o diretório HOME:

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

Para sistemas mais complexos (remotos), getent é o comando usual para obter informações dos usuários do sistema NSS (Name Service Switch libraries).

Um comando de

echo $(getent passwd $USER )| cut -d : -f 6

Fornecerá informações equivalentes (se disponíveis).

    
por 05.12.2015 / 18:54
2

Se o usuário não existir, getent retornará um erro.

Aqui está uma pequena função de shell que não ignora o código de saída de getent :

get_home() {
  local result; result="$(getent passwd "$1")" || return
  echo $result | cut -d : -f 6
}

Veja um exemplo de uso:

da_home="$(get_home missing_user)" || {
  echo 'User does NOT exist!'; exit 1
}

# Now do something with $da_home
echo "Home directory is: '$da_home'"
    
por 31.03.2017 / 15:00
1

Se você estiver logado como root, se você souber a senha de USER , ou se o USER não tiver senha, o seguinte é outra opção:

    su -c 'echo ~' ${USER}

Sob o comportamento padrão su , se USER for indefinido ou vazio, então su tentará executar o comando como root.

Se o valor de USER não for um nome de usuário válido, um erro apropriado será gerado: su: user <user> does not exist .

Já há muitas boas respostas aqui, mas isso ainda pode ajudar alguém.

    
por 20.03.2018 / 20:58