Linux List All Users In The System

ADVERTISEMENTS



Linux list all users account using the /etc/passwd file

I am a new Linux system administrator and I’m unable to find the command to list all users on my Linux server. What is the command to list users under Linux operating systems? How do I list users in Linux?The /etc/passwd file contains one line for each Linux user account, with seven fields delimited by colons. This is a text file. You can easily list users under Linux using the cat command or other commands such as grep command egrep command and more. This page describes various Linux commands to list all users on the Linux operating system, including Ubuntu, Debian, RHEL, Arch, Fedora, CentOS, and other distros.

Type any one of the following command:

$ cat /etc/passwd

Sample outputs:

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh .... .. ... vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin

Each line in the file has seven fields as follows. For example, consider the following line:

vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin

Where,

vnstat – The user name or login name.

– The user name or login name. x – Encrypted password is stored in the /etc/shadow file.

– Encrypted password is stored in the /etc/shadow file. 131 – UID (user ID number)

– UID (user ID number) 137 – Primary GID (group ID number)

– Primary GID (group ID number) vnstat daemon – GECOS. It may includes user’s full name (or application name, if the account is for a program), building and room number or contact person, office telephone number, home telephone number and any other contact information.

– GECOS. It may includes user’s full name (or application name, if the account is for a program), building and room number or contact person, office telephone number, home telephone number and any other contact information. /var/lib/vnstat – Home directory for the user.

– Home directory for the user. /usr/sbin/nologin – Login shell for the user. Pathnames of valid login shells comes from the /etc/shells file.

How to list users in Linux using pagers

Of course we can use pagers such as more/less commands as follows to view the /etc/passwd file:

$ more /etc/passwd

$ less /etc/passwd

Sample outputs:



tail -5 /etc/passwd

head -5 /etc/passwd

Linux list user names only

All fields are separated by a colon (:) symbol. Total seven fields exists. The first field is username. It is used when user logs in. It should be between 1 and 32 characters in length. Of course we can limit outputs using the head command and tail command as follows:

To list only usernames type the following awk command:

$ awk -F':' '{ print $1}' /etc/passwd

Sample outputs:

root daemon bin sys sync games man lp mail news .... .. ..hplip vivek bind haldaemon sshd mysql radvd

Another option is to use the cut command:

$ cut -d: -f1 /etc/passwd

Get a list of all users using the getent command

To get a list of all Linux users you can type the following getent command:

$ getent passwd

$ getent passwd | grep tom

## get a list all users ##

$ getent passwd | cut -d: -f1

## count all user accounts using the wc ##

$ getent passwd | wc -l

One can use the compgen command on Linux to list users and other resources too:

$ compgen -u

Find out whether a user account exists in the Linux server

We can use above commands to see whether a user exists in the Linux machine as follows using the grep command:

compgen -u | grep vivek getent passwd | grep -q sai && echo "User sai found" || echo "User sai not found" compgen -u | grep -q ram && echo "User ram found" || echo "User ram not found" compgen -u | grep vivek getent passwd | grep -q sai && echo "User sai found" || echo "User sai not found" compgen -u | grep -q ram && echo "User ram found" || echo "User ram not found"

A simplified command would be:

getent passwd { username } getent passwd vivek getent passwd {username} getent passwd vivek

How to count user accounts in the Linux server

Want to get user accounts count on your system? Try the wc command as follows:

$ compgen -u | wc -l

$ getent passwd | wc -l



A Note About System and General Users

Each user has numerical user ID called UID. It is defined in /etc/passwd file. The UID for each user is automatically selected using /etc/login.defs file when you use useradd command. To see current value, enter:

$ grep "^UID_MIN" /etc/login.defs

$ grep UID_MIN /etc/login.defs

Sample outputs:

UID_MIN 1000 #SYS_UID_MIN 100

1000 is minimum values for automatic uid selection in useradd command. In other words all normal system users must have UID >= 1000 and only those users are allowed to login into system if shell is bash/csh/tcsh/ksh etc as defined /etc/shells file. Type the following command to list all login users:

## get UID limit ## l =$ ( grep "^UID_MIN" / etc / login.defs ) ## use awk to print if UID >= $UID_LIMIT ## awk -F ':' -v "limit= ${l##UID_MIN} " '{ if ( $3 >= limit ) print $1}' / etc / passwd ## get UID limit ## l=$(grep "^UID_MIN" /etc/login.defs) ## use awk to print if UID >= $UID_LIMIT ## awk -F':' -v "limit=${l##UID_MIN}" '{ if ( $3 >= limit ) print $1}' /etc/passwd

To see maximum values for automatic uid selection in the useradd command, enter:

$ grep "^UID_MAX" /etc/login.defs

Sample outputs:

UID_MAX 60000

In other words, all normal system users must have UID >= 1000 (MIN) and UID <= 60000 (MAX) and only those users are allowed to login into system if shell is bash/csh/tcsh/ksh as defined in the /etc/shells file. Here is an updated code to get details:

## get mini UID limit ## l =$ ( grep "^UID_MIN" / etc / login.defs ) ## get max UID limit ## l1 =$ ( grep "^UID_MAX" / etc / login.defs ) ## use awk to print if UID >= $MIN and UID <= $MAX ## awk -F ':' -v "min= ${l##UID_MIN} " -v "max= ${l1##UID_MAX} " '{ if ( $3 >= min && $3 <= max ) print $0}' / etc / passwd ## get mini UID limit ## l=$(grep "^UID_MIN" /etc/login.defs) ## get max UID limit ## l1=$(grep "^UID_MAX" /etc/login.defs) ## use awk to print if UID >= $MIN and UID <= $MAX ## awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max ) print $0}' /etc/passwd

Sample outputs:

vivek:x:500:500::/home/vivek:/bin/bash raj:x:501:501::/home/raj:/bin/ksh ash:x:502:502::/home/ash:/bin/zsh jadmin:x:503:503::/home/jadmin:/bin/sh jwww:x:504:504::/htdocs/html:/sbin/nologin wwwcorp:x:505:505::/htdocs/corp:/sbin/nologin wwwint:x:506:506::/htdocs/intranet:/bin/bash scpftp:x:507:507::/htdocs/ftpjail:/bin/bash rsynftp:x:508:508::/htdocs/projets:/bin/bash mirror:x:509:509::/htdocs:/bin/bash jony:x:510:510::/home/jony:/bin/ksh amyk:x:511:511::/home/amyk:/bin/ksh

/sbin/nologin is used to politely refuse a login i.e. /sbin/nologin displays a message that an account is not available and exits non-zero. It is intended as a replacement shell field for accounts that have been disabled or you do not want user to login into system using ssh. To filter /sbin/nologin, enter:

#!/bin/bash # Name: listusers.bash # Purpose: List all normal user accounts in the system. Tested on RHEL / Debian Linux to List All Users on Linux # Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+ # ----------------------------------------------------------------------------------- _l = "/etc/login.defs" _p = "/etc/passwd" ## get mini UID limit ## l =$ ( grep "^UID_MIN" $_l ) ## get max UID limit ## l1 =$ ( grep "^UID_MAX" $_l ) ## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ## awk -F ':' -v "min= ${l##UID_MIN} " -v "max= ${l1##UID_MAX} " '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) "$_p" #!/bin/bash # Name: listusers.bash # Purpose: List all normal user accounts in the system. Tested on RHEL / Debian Linux to List All Users on Linux # Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+ # ----------------------------------------------------------------------------------- _l="/etc/login.defs" _p="/etc/passwd" ## get mini UID limit ## l=$(grep "^UID_MIN" $_l) ## get max UID limit ## l1=$(grep "^UID_MAX" $_l) ## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ## awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) "$_p"

Sample outputs:

vivek:x:500:500::/home/vivek:/bin/bash raj:x:501:501::/home/raj:/bin/ksh ash:x:502:502::/home/ash:/bin/zsh jadmin:x:503:503::/home/jadmin:/bin/sh wwwint:x:506:506::/htdocs/intranet:/bin/bash scpftp:x:507:507::/htdocs/ftpjail:/bin/bash rsynftp:x:508:508::/htdocs/projets:/bin/bash mirror:x:509:509::/htdocs:/bin/bash jony:x:510:510::/home/jony:/bin/ksh amyk:x:511:511::/home/amyk:/bin/ksh

Finally, this script lists both system and users accounts:

#!/bin/bash # Name: listusers.bash # Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux # Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+ # ----------------------------------------------------------------------------------- _l = "/etc/login.defs" _p = "/etc/passwd" ## get mini UID limit ## l =$ ( grep "^UID_MIN" $_l ) ## get max UID limit ## l1 =$ ( grep "^UID_MAX" $_l ) ## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ## echo "----------[ Normal User Accounts ]---------------" awk -F ':' -v "min= ${l##UID_MIN} " -v "max= ${l1##UID_MAX} " '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' " $_p " echo "" echo "----------[ System User Accounts ]---------------" awk -F ':' -v "min= ${l##UID_MIN} " -v "max= ${l1##UID_MAX} " '{ if ( !($3 >= min && $3 <= max && $7 != "/sbin/nologin")) print $0 }' " $_p " #!/bin/bash # Name: listusers.bash # Purpose: List all normal user and system accounts in the system. Tested on RHEL / Debian Linux # Author: Vivek Gite <www.cyberciti.biz>, under GPL v2.0+ # ----------------------------------------------------------------------------------- _l="/etc/login.defs" _p="/etc/passwd" ## get mini UID limit ## l=$(grep "^UID_MIN" $_l) ## get max UID limit ## l1=$(grep "^UID_MAX" $_l) ## use awk to print if UID >= $MIN and UID <= $MAX and shell is not /sbin/nologin ## echo "----------[ Normal User Accounts ]---------------" awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( $3 >= min && $3 <= max && $7 != "/sbin/nologin" ) print $0 }' "$_p" echo "" echo "----------[ System User Accounts ]---------------" awk -F':' -v "min=${l##UID_MIN}" -v "max=${l1##UID_MAX}" '{ if ( !($3 >= min && $3 <= max && $7 != "/sbin/nologin")) print $0 }' "$_p"

Sample outputs:

----------[ Normal User Accounts ]--------------- vivek:x:500:500::/home/vivek:/bin/bash raj:x:501:501::/home/raj:/bin/ksh ash:x:502:502::/home/ash:/bin/zsh jadmin:x:503:503::/home/jadmin:/bin/sh wwwint:x:506:506::/htdocs/intranet:/bin/bash scpftp:x:507:507::/htdocs/ftpjail:/bin/bash rsynftp:x:508:508::/htdocs/projets:/bin/bash mirror:x:509:509::/htdocs:/bin/bash jony:x:510:510::/home/jony:/bin/ksh amyk:x:511:511::/home/amyk:/bin/ksh ----------[ Linux List All Users (System User Accounts) ]--------------- 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 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 dbus:x:81:81:System message bus:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin saslauth:x:499:499:"Saslauthd user":/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash memcached:x:498:496:Memcached daemon:/var/run/memcached:/sbin/nologin squid:x:23:23::/var/spool/squid:/sbin/nologin rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

Conclusion

You learned how to get a list of users in Linux machine. We can use the getent, cat, more, cut and other commands to fetch list of user accounts on a Linux system. See how to check list of users in Unix and man pages as follows:

man 5 passwd

man getent

man cut

man awk

help compgen