Eu tenho uma USERvariável no meu script e quero ver o HOMEcaminho dele com base na USERvariável. Como eu posso fazer isso?
Eu tenho uma USERvariável no meu script e quero ver o HOMEcaminho dele com base na USERvariável. Como eu posso fazer isso?
Respostas:
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
~foocom variáveis em bash. Não diretamente, de qualquer maneira.
~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.
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.
evalé necessário. O Bash não processa ~fooapós a expansão variável.
USER.
$USERexpande para apenas uma única seqüência de caracteres alfabéticos.
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).
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'"
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.