Como chegar a HOME, dado USUÁRIO?

41

Eu tenho uma USERvariável no meu script e quero ver o HOMEcaminho dele com base na USERvariável. Como eu posso fazer isso?

MatthewRock
fonte

Respostas:

72

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

Para obter as informações do usuário, você executa getent passwd $USER. Você receberá uma linha de volta parecida com:

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

Agora você pode simplesmente cortar o diretório home a partir dele, por exemplo, usando cut, da seguinte forma:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
Jenny D
fonte
getent é a melhor resposta, especialmente com usuários remotos. em sistemas mais simples, o usuário deve ser suficiente. Modded você.
Rui F Ribeiro
@RuiFRibeiro você não pode usar ~foocom variáveis ​​em bash. Não diretamente, de qualquer maneira.
Muru
11
@ muru - isso é verdade - e é um comportamento especificado. o ~parece parecer tabular, no entanto, e outro comportamento especificado do prefixo til deve ser substituído por um nome de caminho do diretório de trabalho inicial associado ao nome de login obtido usando a getpwnam()função e, portanto, provavelmente essa pesquisa é muito boa. Eu não gosto de extensões de tabulação - gosto de digitar guias.
mikeserv
11
Observe que isso apenas fornece o valor inicial de $ HOME; os scripts de login do usuário têm o direito perfeito de alterá-lo para outra coisa. Isso é algo incomum, mas posso pensar em situações em que seria sensato, por exemplo, escolher entre um local e um homedir montado em NFS.
Zwol
11
Os dois pontos do @HagenvonEitzen são proibidos precisamente porque foram usados ​​para separar campos.
Jenny D
9

Você pode usar evalpara 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 LDAP são tratados eval.

Sarolf.Thorleif
fonte
11
Não há necessidade de avaliação lá. Tenha cuidado com o seu inglês.
Rui F Ribeiro
4
@nwk evalé necessário. O Bash não processa ~fooapós a expansão variável.
Muru
11
Interessante, obrigado, no entanto, isso apenas obtém o diretório do usuário atual , não de outros usuários. Acho que os usuários LDAP não são tratados, embora eu possa estar errado.
Rui F Ribeiro
3
@RuiFRibeiro Funcionará bem com LDAP, basta usar qualquer variável que contenha o nome de usuário do usuário LDAP em vez de USER.
Muru
3
Não use este sem verificar se $USERexpande para apenas uma única seqüência de caracteres alfabéticos.
chepner
4

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

Esse arquivo é legível mundialmente (qualquer um pode lê-lo), portanto, qualquer usuário tem acesso ao seu conteúdo.
Se o $ USER existir no arquivo, a entrada anterior ao último será 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).


fonte
2
você tem ~ usuário para isso, e sua solução não contempla usuários em sistemas mais complexos, como usuários vindos do LDAP, nos quais é necessário usar o getent.
Rui F Ribeiro
2

Se o usuário não existir, getentretornará 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
}

Aqui está 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'"
Elifarley
fonte
1

Se você está logado como root, se você conhece USERa senha ou se a USERsenha não tem, o seguinte é outra opção:

    su -c 'echo ~' ${USER}

Sob o sucomportamento padrão , se USERfor indefinido ou vazio, sutentará executar o comando como root.

Se o valor USERnão é um nome de usuário válido, então um erro apropriada será levantada: su: user <user> does not exist.

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

monotonee
fonte
Isso não é seguro, dependendo da configuração do sistema. Ele executa um processo (o shell executando eco) como esse usuário, para que o usuário possa (por exemplo) rastrear o shell e fornecer uma saída arbitrária. Também está sendo executado na configuração do usuário, portanto, é possível que os arquivos de configuração do shell dos usuários sejam executados (o que também pode fornecer resultados arbitrários). Ou ambiente carrega via pam. Etc. Ou simplesmente faça algo tão simples como enviar um SIGSTOP para levar uma eternidade, efetivamente, DOS atacando seu script.
derobert 16/04