# How can I look up a username by id in linux?

The command id can be used to look up a user's uid, for example:

$id -u ubuntu 1000  Is there a command to lookup up a username from a uid? I realize this can be done by looking at the /etc/passwd file but I'm asking if there is an existing command to to this, especially if the user executing it is not root. I'm not looking for the current user's username, i.e. I am not looking for whoami or logname. This also made me wonder if on shared web hosting this is a security feature, or am I just not understanding something correctly? For examination, the /etc/passwd file from a shared web host: 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  And here is a sample directory listing of /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  We can see root is the owner of some files, and root is also showing up in /etc/passwd , however the other users/groups all show up as numbers. - Keep in mind that more than one user may have the same UID. It's rare, but happens occasionally. – Barry Brown Apr 17 '12 at 2:47 ## 4 Answers ls already performs that lookup. You can perform a user information lookup from the command line with getent passwd. If ls shows a user ID instead of a user name, it's because there's no user by that name. Filesystems store user IDs, not user names. If you mount a filesystem from another system, or if a file belongs to a now-deleted user, or if you passed a numerical user ID to chown, you can have a file that belongs to a user ID that doesn't have a name. On a shared host, you may have access to some files that are shared between several virtual machines, each with their user database. This is a bit weird (why share files but not the users that own them?), but it's technically possible. - You might enjoy this little ditty. $ id -nu [number]


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

I can confirm that it returns a corresponding user name, if one exists, on Arch Linux. I can also confirm that it does not work on Ubuntu when run as a normal user, although I have not tested this as the superuser. It also does not work on Alpine Linux. Maybe a security feature prevents this from working on some systems.

-
id -u jimmij => 1000. id -nu 1000 => id: 1000: no such user. –  jimmij Nov 21 '14 at 12:39

Parse /etc/passwd:

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

-
Unlike getent, this does not work if the system uses LDAP. –  choroba Apr 17 '12 at 8:51
this doesn't work either if NIS is used or whatever other distributed authentication protocol. –  jlliagre Apr 18 '12 at 1:25
@choroba : if he had a specific requirement for LDAP or NIS, he probably would have mentioned it. My solution works on typical linux setups. –  laebshade Apr 18 '12 at 2:55

Try

getent passwd "$uid" | cut -d: -f1  - If this returns nothing does that mean I don't have access to translate the id to a username? – cwd Apr 17 '12 at 4:07 More likely you didnt set "$uid" or that uid doesn't exist. Does grep ":\$uid:" /etc/passwd find it? Does getent passwd produce any output? –  Mikel Apr 17 '12 at 4:14
@cwd: You should always have access to translate an id to a username. For instance, ls -l is always doing this. –  camh Apr 17 '12 at 7:00
Just curious because looking at an ls listing on a shared host was showing numbers in the user / group name columns with ls. Perhaps it is a security precaution or jailshell thing? –  cwd Apr 17 '12 at 19:50
@cwd More likely the shared host is using an /etc/passwd` mounted / shared from elsewhere which wasn't mounted at the time. –  jw013 Apr 17 '12 at 19:56