GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir le nom de l'utilisateur à partir de l'uid

Avec GNU id , vous pouvez faire :

id -un -- "$cheruid"

Cela interrogera la base de données du compte (si elle est stockée dans /etc/passwd , LDAP, NIS+, un RDBMS...) pour le premier nom d'utilisateur avec cet uid.

Généralement, il n'y a qu'un seul nom d'utilisateur par uid, mais ce n'est pas garanti, la clé dans la base de données des comptes d'utilisateurs est le nom d'utilisateur, pas l'identifiant de l'utilisateur.

Si vous souhaitez connaître tous les noms d'utilisateurs pour un uid donné, vous pouvez faire :

getent passwd | ID=$cheruid awk -F: '$3 == ENVIRON["ID"] {print $1}'

Mais cela peut ne pas fonctionner pour certaines bases de données de comptes qui ne sont pas énumérables (comme c'est parfois le cas pour les grandes plateformes basées sur LDAP).


$ printf 'User is %s\n' "$( getent passwd 1001 | cut -d : -f 1 )"
User is myself

(il y a un myself utilisateur avec l'UID 1001 sur mon système)

Cela interrogerait le passwd base de données pour l'UID donné, supprimez le nom d'utilisateur de cette réponse et utilisez le résultat comme argument de printf . Cela ne fonctionnerait pas sur macOS.

Pour intercepter les UID inconnus :

$ printf 'User is %s\n' "$( { getent passwd 1001 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is myself
$ printf 'User is %s\n' "$( { getent passwd 1002 || echo 'UNKNOWN USER'; } | cut -d : -f 1 )"
User is UNKNOWN USER

En tant que script prenant n'importe quel nombre d'UID sur la ligne de commande (avec une sortie légèrement modifiée) :

#!/bin/sh

for uid do
    printf 'User with UID %d is %s\n' "$uid" \
        "$( { getent passwd "$uid" || echo 'NOT KNOWN'; } | cut -d : -f 1 )"
done

Test (cela passerait par les UID de certains comptes de service sur mon système OpenBSD) :

$ sh ./script.sh {110..115}
User with UID 110 is _sndiop
User with UID 111 is NOT KNOWN
User with UID 112 is _syspatch
User with UID 113 is NOT KNOWN
User with UID 114 is NOT KNOWN
User with UID 115 is _slaacd

Aide avec le shellscript original

Le test dans l'instruction if est à l'origine du problème. Je suggère le shellscript suivant,

#!/bin/bash

read -p "donner l UID " cheruid

 if [ "$(grep -w "^$cheruid" /etc/passwd)" != "" ]
 then
    grep -w "$cheruid" /etc/passwd | cut -d ":" -f "1" | xargs echo "user is : "
else
    echo "user not found"
fi

Edit1 :j'ai ajouté un ^ dans le test pour rechercher uniquement les correspondances en début de ligne.

Edit2 :depuis : est un séparateur, vous pouvez le supprimer et tout ce qui suit, et utiliser le résultat directement dans le echo ligne, si elle est acceptée dans le test, et simplifiez le shellscript en

#!/bin/bash

read -p "donner l UID " cheruid

cheruid=${cheruid%%:*}
user=$(grep -wo "^$cheruid" /etc/passwd)

if [ "$user" != "" ]
then
    echo "user is : $user"
else
    echo "user not found"
fi

Cela vous aide à créer un bon script shell bash.

Méthode efficace et plus générale pour trouver des identifiants d'utilisateur avec id

Si vous voulez un moyen efficace de vérifier si un nom d'utilisateur particulier existe, <test-name> , vous pouvez utiliser id , comme l'indique une autre réponse à votre question par Stéphane Chazelas :

id -un -- <test-name>

par exemple

id -un -- mehdi

id trouvera non seulement les ID utilisateur stockés dans /etc/passwd mais aussi ceux gérés et stockés d'autres manières, par exemple LDAP, qui est courant dans les systèmes de serveurs professionnels comme le commente Matteo Italia.

Si vous souhaitez analyser tous les utilisateurs

  • utilisateurs du système, dans de nombreux systèmes Linux avec des numéros d'utilisateur < 1 000

  • utilisateurs "humains", dans de nombreux systèmes Linux avec des numéros d'utilisateur>=1000

  • et en supposant que tous les utilisateurs ont un numéro < 2000 (modifiez si nécessaire)

vous pouvez utiliser le bash suivant one-liner, qui utilise une boucle avec id ,

for ((i=0;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Si vous souhaitez voir uniquement les utilisateurs "humains" et supposer qu'aucun numéro d'identification d'utilisateur n'est ignoré (aucun utilisateur supprimé), le bash suivant oneliner est très rapide,

i=1000;while true;do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$name" ;else break;fi;i=$((i+1));done

mais il est plus fiable de supposer que certains numéros d'identification peuvent être ignorés (utilisateurs supprimés),

for ((i=1000;i<2000;i++));do name=$(id -un $i 2>/dev/null);if [ $? -eq 0 ];then echo "$i: $name" ;fi;done

Il y a aussi users et who qui impriment les noms d'utilisateur des utilisateurs actuellement connectés à l'hôte actuel.


Linux
  1. Comment ajouter ou supprimer un utilisateur d'un groupe sous Linux

  2. Comment puis-je obtenir le nom d'utilisateur dans un Makefile ?

  3. Comment obtenir la sortie de gdb.execute dans PythonGDB (GDB 7.1) ?

  4. Comment obtenir un processus enfant à partir d'un processus parent

  5. Comment obtenir le nom d'hôte de l'IP (Linux) ?

Qu'est-ce que l'UID sous Linux, comment le trouver et le modifier

Comment obtenir des nouvelles instantanément à partir de la ligne de commande sous Linux

Comment obtenir la liste des comptes utilisateur MySQL sous Linux

Comment générer de la RSE à partir de WHM ?

Comment trouver le nom du processus à partir de son PID

Comment obtenir un nom de domaine sous Windows à l'aide de la commande ?