Eu tenho uma USER
variável no meu script e quero ver o HOME
caminho dele com base na USER
variável. Como eu posso fazer isso?
Eu tenho uma USER
variável no meu script e quero ver o HOME
caminho dele com base na USER
variá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/passwd
no 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
~foo
com 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 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 LDAP são tratados eval
.
eval
é necessário. O Bash não processa ~foo
após a expansão variável.
USER
.
$USER
expande 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, 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
}
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 USER
a senha ou se a USER
senha não tem, o seguinte é outra opção:
su -c 'echo ~' ${USER}
Sob o su
comportamento padrão , se USER
for indefinido ou vazio, su
tentará executar o comando como root.
Se o valor USER
nã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.