Linux 列出系统命令中的所有用户
/etc/passwd 文件为每个 Linux 用户帐户包含一行,其中有七个字段以冒号分隔。这是一个文本文件。您可以使用cat 命令或其他命令(如grep 命令/ egrep 命令等)轻松列出 Linux 下的用户。本页介绍了 Linux 的各种 Linux 命令,用于列出 Linux 操作系统上的所有用户和选项,包括 Ubuntu、Debian、RHEL、Arch、Fedora、CentOS 和其他发行版。
Linux 使用 /etc/passwd 文件列出所有用户帐户
为了列出 Linux 上的所有用户,请使用cat /more/less 命令或bat 命令,如下所示:
$ cat /etc/passwd
Linux list users 输出:
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
文件中的每一行都有以下七个字段。例如,请考虑以下行:
vnstat:x:131:137:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
其中,
- vnstat– 用户名或登录名。
- x– 加密密码存储在/etc/shadow 文件中。
- 131– UID(用户 ID 号)
- 137– 主 GID(组 ID 号)
- vnstat daemon– GECOS。它可能包括用户的全名(或应用程序名称,如果帐户用于某个程序)、建筑物和房间号码或联系人、办公室电话号码、家庭电话号码和任何其他联系信息。
- /var/lib/vnstat– 用户的主目录。
- /usr/sbin/nologin– 用户的登录 shell。有效登录 shell 的路径名来自 /etc/shells 文件。
如何使用分页器列出 Linux 中的用户
当然,我们可以使用诸如 more/less 命令之类的分页器来查看 /etc/passwd 文件,如下所示:
示例输出:
$ more /etc/passwd
$ less /etc/passwd
图 01:使用 /etc/passwd 列出用户
$ tail -5 /etc/passwd
$ head -5 /etc/passwd
Linux 仅列出用户名
要仅列出用户名,请输入以下 awk 命令:
$ awk -F':' '{ print $1}' /etc/passwd
示例输出:
root daemon bin sys sync games man lp mail news .... .. ..hplip vivek bind haldaemon sshd mysql radvd
另一个选择是使用 cut 命令:
$ cut -d: -f1 /etc/passwd
使用 getent 命令获取所有用户列表
要获取所有 Linux 用户的列表,您可以输入以下 getent 命令:也
可以使用Linux 上的 compgen 命令列出用户和其他资源:
$ getent passwd
$ getent passwd | grep tom
## OR ##
$ getent passwd tom
## get a list all users ##
$ getent passwd | cut -d: -f1
## count all user accounts using the wc ##
$ getent passwd | wc -l
$ compgen -u
查找 Linux 服务器中是否存在用户账户
我们可以使用上述命令来查看 Linux 机器中是否存在某个用户,如下所示,使用grep 命令:
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"
简化的命令如下:
getent passwd {username} getent passwd vivek
如何统计Linux服务器中的用户账户
想要获取系统上的用户帐户数?请尝试以下 wc 命令:
$ compgen -u | wc -l
$ getent passwd | wc -l
关于系统用户和一般用户的说明
每个用户都有一个数字用户 ID,称为 UID。它在 /etc/passwd 文件中定义。当您使用 useradd 命令时,每个用户的 UID 都会使用 /etc/login.defs 文件自动选择。要查看当前值,请输入:
示例输出:
$ grep "^UID_MIN" /etc/login.defs
$ grep UID_MIN /etc/login.defs
UID_MIN 1000 #SYS_UID_MIN 100
1000 是 useradd 命令中自动 uid 选择的最小值。换句话说,所有普通系统用户的 UID 必须 >= 1000,并且只有当 shell 是 /etc/shells 文件中定义的 bash/csh/tcsh/ksh 等时,这些用户才允许登录系统。输入以下命令列出所有登录用户:
## 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
要查看 useradd 命令中自动 uid 选择的最大值,请输入:
$ grep "^UID_MAX" /etc/login.defs
示例输出:
UID_MAX 60000
换句话说,所有普通系统用户的 UID 必须 >= 1000 (MIN) 且 UID <= 60000 (MAX),并且只有当 shell 为 /etc/shells 文件中定义的 bash/csh/tcsh/ksh 时,这些用户才允许登录系统。以下是获取详细信息的更新代码:
## 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
示例输出:
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 用于礼貌地拒绝登录,即 /sbin/nologin 显示帐户不可用的消息并以非零值退出。它旨在作为已禁用帐户或您不希望用户使用 ssh 登录系统的帐户的替代 shell 字段。要过滤 /sbin/nologin,请输入:
#!/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.example.com>, 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"
示例输出:
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
最后,该脚本列出了系统和用户账户:
#!/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.example.com>, 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"
示例输出:
----------[ 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
查看谁登录了 Linux 系统以及他们在做什么
输入w 命令:
$ w
我看到的是:
17:26:11 up 51 days, 20:34, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT admin pts/0 13t.1yx.3x.1zz 17:25 0.00s 0.01s 0.00s vim vivek pts/1 13t.1xx.3x.1zz 17:25 0.00s 0.01s 0.00s gcc
要显示有关名为“tom”的指定用户的信息,请运行:
$ sudo w tom
您还可以使用who 命令显示谁登录了您的 Linux 服务器:
$ who
请注意,有关当前登录用户的信息是从/var/run/utmp读取的。uptime 命令将告诉您系统已运行了多长时间:
$ uptime
输出:
17:25:56 up 51 days, 20:33, 1 user, load average: 0.00, 0.00, 0.00
结论
您学习了如何在 Linux 机器上获取用户列表。我们可以使用 getent、cat、more、cut 和其他命令来获取 Linux 系统上的用户帐户列表。了解如何使用 man 命令或 help 命令在 Unix和手册页中检查用户列表:
$ man 5 passwd
$ man getent
$ man cut
$ man awk
$ help compgen