Comment puis-je rechercher un nom d'utilisateur par identifiant sous linux?


67

La commande idpeut être utilisée pour rechercher un utilisateur uid, par exemple:

$ id -u ubuntu
1000

Existe-t-il une commande permettant de rechercher un nom d'utilisateur dans un fichier uid? Je me rends compte que cela peut être fait en consultant le /etc/passwdfichier, mais je demande s’il existe une commande existante, surtout si l’utilisateur qui l’exécute n’est pas root.

Je ne cherche pas le nom d' utilisateur de l'utilisateur actuel , c'est-à-dire que je ne cherche pas whoamiou logname.

Cela m'a également incité à me demander si l'hébergement Web partagé est une fonctionnalité de sécurité ou si je ne comprends pas quelque chose correctement.

Pour examen, le /etc/passwdfichier d'un hôte Web partagé:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
avahi:x:70:70:Avahi daemon:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
xfs:x:43:43:X Font Server:/etc/X11/fs:/sbin/nologin
avahi-autoipd:x:100:104:avahi-autoipd:/var/lib/avahi-autoipd:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
mailman:x:32006:32006::/usr/local/cpanel/3rdparty/mailman/mailman:/usr/local/cpanel/bin/noshell
dovecot:x:97:97:dovecot:/usr/libexec/dovecot:/sbin/nologin
mysql:x:101:105:MySQL server:/var/lib/mysql:/bin/bash
cpaneleximfilter:x:32007:32009::/var/cpanel/userhomes/cpaneleximfilter:/usr/local/cpanel/bin/noshell
nagios:x:102:106:nagios:/var/log/nagios:/bin/sh
ntp:x:38:38::/etc/ntp:/sbin/nologin
myuser:x:1747:1744::/home/myuser:/usr/local/cpanel/bin/jailshell

Et voici un exemple de liste de répertoires de /tmp/

drwx------  3 root     root        1024 Apr 16 02:09 spamd-22217-init/
drwxr-xr-x  2      665      664    1024 Apr  4 00:05 update-cache-44068ab4/
drwxr-xr-x  4      665      664    1024 Apr 17 15:17 update-extraction-44068ab4/
-rw-rw-r--  1      665      664   43801 Apr 17 15:17 variable.zip
-rw-r--r--  1      684      683    4396 Apr 17 07:01 wsdl-13fb96428c0685474db6b425a1d9baec

Nous pouvons voir que rootle propriétaire de certains fichiers rootapparaît également /etc/passwd, mais les autres utilisateurs / groupes apparaissent tous sous forme de chiffres.


6
N'oubliez pas que plusieurs utilisateurs peuvent avoir le même UID. C'est rare, mais cela arrive parfois.
Barry Brown

Réponses:


35

lseffectue déjà cette recherche. Vous pouvez effectuer une recherche d'informations utilisateur à partir de la ligne de commande avec getent passwd.

Si lsaffiche un ID utilisateur au lieu d'un nom d'utilisateur, c'est qu'il n'y a aucun utilisateur portant ce nom. Les systèmes de fichiers stockent les ID utilisateur, pas les noms d'utilisateur. Si vous montez un système de fichiers depuis un autre système, si un fichier appartient à un utilisateur maintenant supprimé ou si vous avez passé un ID utilisateur numérique chown, vous pouvez avoir un fichier appartenant à un ID utilisateur sans nom.

Sur un hôte partagé, vous pouvez avoir accès à certains fichiers partagés entre plusieurs machines virtuelles, chacune avec sa base de données d'utilisateurs. C'est un peu bizarre (pourquoi partager des fichiers mais pas les utilisateurs qui les possèdent?), Mais c'est techniquement possible.


2
Je vois le numéro au lieu du nom ls -ls'il est composé de plus de huit caractères.
Kgrittn

@kgrittn Cela peut dépendre de la variante Unix. GNU ls affiche le nom d'utilisateur complet. BusyBox ls le tronque à 8 caractères (au moins sur la version que j'ai ici).
Gilles 'SO- arrête d'être méchant'

66

Essayer

getent passwd "$uid" | cut -d: -f1

Si cela ne retourne rien, cela signifie-t-il que je n'ai pas accès à la traduction de l'identifiant en nom d'utilisateur?
cwd

1
Plus probablement, vous n'avez pas t set "$ uid" `ou cet uid n'existe pas. Le grep ":$uid:" /etc/passwdtrouve- t- il? Ne getent passwdproduit aucune sortie?
Mikel

@cwd: Vous devriez toujours avoir accès à la traduction d'un identifiant en un nom d'utilisateur. Par exemple, ls -lfait toujours cela.
camh le

Juste curieux parce que regarder une lsliste sur un hôte partagé montrait des nombres dans les colonnes de nom d'utilisateur / groupe avec ls. Peut-être est-ce une précaution de sécurité ou une chose jailshell?
cwd

@cwd Il est plus probable que l'hôte partagé utilise un système /etc/passwdmonté / partagé provenant d'ailleurs qui n'était pas monté à ce moment-là.
jw013

39

Vous pourriez apprécier cette petite chanson.

$ id -nu [number]

3.17.3-1-ARCH # 1 SMP PREEMPT Vendredi 14 novembre 22:56:01 CET 2014 i686 GNU / Linux

Je peux confirmer qu'il renvoie un nom d'utilisateur correspondant, s'il en existe un, sur Arch Linux. Je peux également confirmer que cela ne fonctionne pas sur Ubuntu lorsqu'il est exécuté en tant qu'utilisateur normal, bien que je n'ai pas testé cela en tant que superutilisateur. Cela ne fonctionne pas non plus sur Alpine Linux. Une fonctionnalité de sécurité empêche peut-être cela de fonctionner sur certains systèmes.


id -u jimmij=> 1000. id -nu 1000=> id: 1000: no such user.
jimmij

2
fonctionne pour moi, avec id --version=id (GNU coreutils) 8.23
eMPee584

Fonctionne également sous FreeBSD 10.3.
forquare

remarque: cela fonctionne sur Red Hat / CentOS> = 7 (pas sur Red Hat / CentOS <= 6)
Franklin Piat

FYI cela ne fonctionne pas sur les images busybox / alpine linux / docker alpin
jjj le

0

Je réalise que c'est une vieille question, mais voici une autre réponse

awk -F: '{print $1,$3}' /etc/passwd | grep <UID>

Pipe à grepquoi? (De plus, si vous ajoutez quatre espaces au début de la ligne, le texte sera converti en texte à largeur fixe.)
Wildcard

Je préfère la réponse avec getent passwd. Mais si vous analysez / etc / passwd, il serait plus judicieux d’utiliser awk uniquement ID=0 ; awk -F: '{if ( $3 == '"$ID"' ) print $1}' /etc/passwd.
Franklin Piat

-1

Parse / etc / passwd:

% awk -F: "/:$(id -u ubuntu):/{print \$1}" /etc/passwd
ubuntu

7
Contrairement à getentcela, cela ne fonctionne pas si le système utilise LDAP.
Choroba

3
cela ne fonctionne pas si NIS est utilisé ou quel que soit le protocole d'authentification distribué.
Jlliagre

@choroba: s'il avait eu une exigence spécifique pour LDAP ou NIS, il l'aurait probablement mentionnée. Ma solution fonctionne sur des configurations Linux typiques.
laebshade

2
votez vers le bas parce que ce n’est pas fiable (cela peut correspondre à l’utilisateur ou au groupe).
Franklin Piat

-1
id | awk '{print $1}' | sed 's:.*(::;s:)$::'

4
Bonjour NAIM. Bien que cela puisse être une réponse correcte, cela aiderait le demandeur (et fort probablement les futurs lecteurs de votre solution) si vous pouviez modifier votre réponse pour expliquer brièvement comment cela fonctionne.
Roaima
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.