J'ai une USER
variable dans mon script et je veux voir son HOME
chemin basé sur la USER
variable. Comment puis je faire ça?
J'ai une USER
variable dans mon script et je veux voir son HOME
chemin basé sur la USER
variable. Comment puis je faire ça?
Réponses:
Il existe un utilitaire qui recherche les informations utilisateur indépendamment du fait que ces informations soient stockées dans des fichiers locaux tels que /etc/passwd
ou dans LDAP ou une autre méthode. Ça s'appelle getent
.
Pour en extraire les informations utilisateur, vous exécutez getent passwd $USER
. Vous obtiendrez une ligne qui ressemble à ceci:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Maintenant, vous pouvez simplement en couper le répertoire home, par exemple en utilisant cut, comme suit:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
avec des variables dans bash
. Pas directement, de toute façon.
~
semble cependant que l'onglet semble se développer et qu'un autre comportement spécifié du préfixe tilde doit être remplacé par un chemin d'accès du répertoire de travail initial associé au nom de connexion obtenu à l'aide de la getpwnam()
fonction . Cette recherche est donc probablement très bonne. Je n'aime pas les extensions de tabulation, cependant - j'aime taper des tabulations.
Vous pouvez utiliser eval
pour obtenir le répertoire personnel de quelqu'un.
eval echo "~$USER"
Au moins pour les utilisateurs locaux, cela fonctionne à coup sûr. Je ne sais pas si les utilisateurs distants comme LDAP sont gérés eval
.
eval
est nécessaire. Bash ne traite pas ~foo
après une expansion variable.
USER
.
$USER
développe pour juste une seule chaîne de caractères alphabétiques.
La place habituelle est /home/$USER
, mais cela ne doit pas nécessairement être universel. Le lieu définitif pour rechercher de telles informations se trouve dans le fichier /etc/passwd
.
Ce fichier est lisible dans le monde entier (tout le monde peut le lire), ainsi tout utilisateur a accès à son contenu.
Si $ USER existe dans le fichier, l'entrée précédente est le répertoire HOME de l'utilisateur.
Ceci sélectionnera l’entrée et imprimera le répertoire HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
Pour les systèmes plus complexes (distants), getent est la commande habituelle pour obtenir des informations sur les utilisateurs à partir du système NSS (Name Service Switch libraries).
Une commande de
echo $(getent passwd $USER )| cut -d : -f 6
Fournira des informations équivalentes (si disponibles).
Si l'utilisateur n'existe pas, getent
une erreur sera renvoyée.
Voici une petite fonction shell qui n'ignore pas le code de sortie de getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Voici un exemple d'utilisation:
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'"
Si vous êtes connecté en tant qu'utilisateur root, si vous connaissez USER
le mot de passe ou s'il USER
n'y en a pas, l'option suivante est une autre option:
su -c 'echo ~' ${USER}
Sous le su
comportement standard , s'il USER
est non défini ou vide, il su
tentera alors d'exécuter la commande en tant que root.
Si la valeur USER
est pas un nom d'utilisateur valide, une erreur appropriée sera soulevée: su: user <user> does not exist
.
Il y a déjà beaucoup de bonnes réponses ici, mais cela peut toujours aider quelqu'un.