web-dev-qa-db-fra.com

Comment rentrer à la MAISON, vu UTILISATEUR?

J'ai une variable USER dans mon script et je veux voir son chemin HOME basé sur la variable USER. Comment puis je faire ça?

41
MatthewRock

Il existe un utilitaire qui recherche les informations utilisateur, que ces informations soient stockées dans des fichiers locaux tels que /etc/passwd ou dans LDAP ou une autre méthode. Cela 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 d'origine, par ex. en utilisant cut, comme ceci:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
74
Jenny D

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 traités avec eval.

10
Sarolf.Thorleif

L'endroit habituel est /home/$USER, mais cela ne doit pas être universel. L'endroit définitif pour rechercher de telles informations est à l'intérieur du fichier /etc/passwd.

Ce fichier est lisible par tout le monde (n'importe qui peut le lire), donc tout utilisateur a accès à son contenu.
Si $ USER existe dans le fichier, l'entrée avant-dernière est le répertoire HOME de l'utilisateur.

Cela 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 bibliothèques).

Une commande de

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

Fournira des informations équivalentes (si disponibles).

4
user79743

Si l'utilisateur n'existe pas, getent renverra une erreur.

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'"
2
Elifarley

Si vous êtes connecté en tant que root, si vous connaissez le mot de passe de USER, ou si le USER n'a pas de mot de passe, voici une autre option:

    su -c 'echo ~' ${USER}

Sous le comportement standard de su, si USER n'est pas défini ou vide, alors su tentera d'exécuter la commande en tant que root.

Si la valeur de USER n'est pas un nom d'utilisateur valide, une erreur appropriée sera générée: su: user <user> does not exist.

Il y a déjà beaucoup de bonnes réponses ici, mais cela peut encore aider quelqu'un.

1
monotonee