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.