How To List Users In Linux

How To List Users In Linux

Reading time1 min
#Linux#Sysadmin#Security#UserManagement#LinuxUsers#UserEnumeration

Mastering User Enumeration in Linux: Beyond the Basic cat /etc/passwd

Forget the oversimplified commands everyone shares; let's dive into the nuances of user enumeration in Linux that reveal real system insights and help you manage users like a pro.


When it comes to Linux system management, knowing who is on your system is foundational. Most beginners start with the classic:

cat /etc/passwd

And while this is a good starting point, it barely scratches the surface. Understanding how to accurately list and interpret Linux users is crucial for system security audits, smooth user management, and troubleshooting access issues efficiently.

Today, we'll go beyond that simple file cat and explore effective methods to enumerate users on Linux — with explanations and practical examples.


Why Not Just Use /etc/passwd?

The /etc/passwd file historically contains user account information — usernames, user IDs (UIDs), home directories, shells, etc. Listing it shows all local accounts as text lines like:

root:x:0:0:root:/root:/bin/bash
john:x:1001:1001:John Doe,,,:/home/john:/bin/bash

But:

  • It includes system/service accounts (daemon users)
  • It doesn’t show currently logged-in users
  • It can’t enumerate users from LDAP/NIS/etc.
  • No indication of account activity or last login

So how do you get meaningful user data?


1. List All Local Human Users Using getent passwd

Instead of reading /etc/passwd directly, use getent passwd. It's an abstraction tool that looks up entries from various supported sources configured in /etc/nsswitch.conf, including LDAP or NIS if configured.

getent passwd

To list only human (non-system) users, you can filter by UID:

getent passwd | awk -F: '$3 >= 1000 && $3 != 65534 { print $1 }'

Explanation:

  • Field $3 = UID
  • UIDs >= 1000 typically belong to regular users (this varies per distro)
  • UID 65534 is nobody, excluded here

This gives a clean list of actual user accounts — no system noise.


2. Check Who’s Currently Logged In (who and w)

Knowing who exists is useful — but often you want to know who’s actively logged into your system:

who

Output might be:

john     pts/0        2024-06-20 09:13 (:0)
mary     pts/2        2024-06-20 09:50 (192.168.1.15)

Alternatively,

w

Shows users plus their activity details (what command they're running etc.).


3. Viewing Last Login Information With lastlog

To check when each user last logged in:

lastlog

Sample output:

Username         Port     From             Latest
root             pts/0    :0               Tue Jun 20 08:45:03 +0000 2024
john             pts/1    192.168.1.10     Mon Jun 19 17:00:00 +0000 2024
mary             **Never logged in**

This helps identify dormant accounts or those that haven’t been used recently—important for audit and cleanup.


4. User Info Using id and finger

To gather detailed info about any individual user:

id username

Example:

id john

uid=1001(john) gid=1001(john) groups=1001(john),27(sudo)

Or via finger (may need installation):

finger john

Login: john                             Name: John Doe
Directory: /home/john                   Shell: /bin/bash
Last login Mon Jun 19 17:00 on pts/1 from 192.168.1.10
No mail.
No Plan.

These commands provide insight into groups, shells, home directories, last access times etc.


5. Filter Users By Shell Type

If you want to see only users with valid interactive logins (exclude service accounts with shells like /bin/false or /usr/sbin/nologin):

getent passwd | awk -F ':' '/\/bin\/bash|\/bin\/sh|\/bin\/zsh/ {print $1}'

Alternatively, check for all valid shells using /etc/shells as a reference:

valid_shells=$(cat /etc/shells | tr '\n' '|' | sed 's/|$//')

getent passwd | awk -F ':' -v shells="$valid_shells" '
{
 split(shells,s,"|");
 for(i in s){
   if($7 == s[i]){
     print $1;
     next;
   }
 }
}'

This helps identify real interactive user accounts only.


Summary Cheat Sheet

TaskCommand Example
List all userscat /etc/passwd
List all configured usersgetent passwd
List human users (UID >=1000)`getent passwd
See who’s logged inwho, w
Last login per userlastlog
Info about specific userid username, finger username
List valid shell usersFilter with shell paths via /etc/shells + getent

Final Thoughts

User enumeration isn’t just a curiosity—it's critical for security audits to make sure no rogue or dormant accounts exist on your system helping bad actors gain entry.

Armed with these enhanced tools and techniques beyond the basic /etc/passwd, you’re now ready to enumerate users like a Linux pro — gaining real insight into your systems' user base and access control landscape.

Happy auditing!


Got other favorite tricks for managing Linux users? Drop your tips below!