Je suis en train d'écrire un programme en bash qui doit obtenir le nom d'utilisateur de l'utilisateur.
J'ai entendu parler d'une chose appelée whoami
mais je n'ai aucune idée de ce qu'elle fait ni de la façon de l'utiliser.
Quelle commande dois-je utiliser pour obtenir le nom d'utilisateur actuel?
Sur la ligne de commande, entrez
echo "$USER"
ou
whoami
Pour enregistrer ces valeurs dans une variable, faites
myvariable=$(whoami)
ou
myvariable=$USER
Bien sûr, vous n’avez pas besoin de créer une variable puisque c’est à cela que sert la variable $USER
.
alternative à whoami
est id -u -n
.
id -u
renverra l'identifiant de l'utilisateur (par exemple 0 pour root).
Un hack que j'ai utilisé sous Solaris 9 et Linux et qui fonctionne très bien pour les deux:
ps -o user= -p $$ | awk '{print $1}'
Cet extrait imprime le nom de l'utilisateur avec le numéro EUID actuel.
NOTE: vous avez besoin de Bash comme interprète ici.
Sous Solaris, vous rencontrez des problèmes avec les méthodes décrites ci-dessus:
id
n'accepte pas les paramètres -u
et -n
(vous devrez donc analyser la sortie)whoami
n'existe pas (par défaut)who am I
imprime le propriétaire du terminal actuel (ignore EUID)$USER
est définie correctement uniquement après la lecture des fichiers de profil (par exemple /etc/profile
)Deux commandes:
id
imprime l'ID utilisateur avec les groupes . Format: uid=usernumber(username) ...
whoami
donne le nom d'utilisateur actuel
Utilisez la commande standard Unix/Linux/BSD/MacOS logname
pour extraire l'utilisateur connecté. Cela ignore l'environnement ainsi que Sudo, car ce sont des journalistes peu fiables. Il imprimera toujours le nom de l'utilisateur connecté, puis se fermera. Cette commande existe depuis environ 1981.
My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ Sudo logname
Password:
devin
My-Mac:~ devin$ Sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root
Lorsque des autorisations root (Sudo) sont requises, ce qui correspond généralement à 90% + lors de l'utilisation de scripts, les méthodes ci-dessus vous donnent toujours root
comme réponse.
Obtenir l'utilisateur "connecté" actuel est tout aussi simple, mais nécessite l'accès à différentes variables: $Sudo_UID
et $Sudo_USER
.
Ils peuvent être répercutés:
echo $Sudo_UID
echo $Sudo_USER
ou assigné, par exemple:
myuid=$Sudo_UID
myuname=$Sudo_USER
Sous Solaris, j'ai utilisé cette commande.
$ who am i # remember to use it with space.
Sous Linux, quelqu'un a déjà répondu à cela dans les commentaires.
$ whoami # without space
Pour bash/ksh/sh
etc. Beaucoup de vos questions trouvent rapidement une réponse:
man [function]
pour obtenir la documentation du système que vous utilisez.
ou généralement plus facilement: google "man function" Cela peut donner des résultats différents pour certaines choses où linux et unix ont des différences modestes.
Pour cette question, entrez simplement "whoami" dans votre Shell.
Pour le script:
myvar=$(whoami)
Le nom d'utilisateur de l'utilisateur actuel peut être obtenu en Bash pur avec l'extension de paramètre ${parameter@operator}
(introduite dans Bash 4.4):
$ : \\u
$ printf '%s\n' "${_@P}"
Le :
intégré (synonyme de true
) est utilisé à la place d'une variable temporaire en définissant le dernier argument, qui est stocké dans $_
. Nous le développons ensuite (\u
) comme s'il s'agissait d'une chaîne d'invite avec l'opérateur P
.
C'est mieux que d'utiliser $USER
, car $USER
n'est qu'une variable d'environnement ordinaire; il peut être modifié, désactivé, etc. Même si ce n’est pas intentionnellement falsifié, un cas courant dans lequel il est toujours incorrect est celui où l’utilisateur change sans ouvrir de shell de connexion (valeur par défaut de su
).
Sur la plupart des systèmes Linux, il suffit de taper whoami sur la ligne de commande pour obtenir l’ID utilisateur.
Toutefois, sous Solaris, vous devrez peut-être déterminer l'ID utilisateur en déterminant l'UID de l'utilisateur connecté à l'aide de la commande ci-dessous.
echo $UID
Une fois que l'UID est connu, recherchez l'utilisateur en faisant correspondre l'UID au/etc/passwd.
cat /etc/passwd | cut -d":" -f1,3