如何在Linux中列出用户?
你是否曾经想列出你的Linux系统中的所有用户,或者统计系统中的用户数量?有一些命令可以创建用户、删除用户、列出已登录的用户,但在Linux中列出所有用户的命令是什么?
本教程将向你展示如何在Linux系统中列出用户。
使用/etc/passwd
文件获取所有用户的列表
本地用户信息被存储在/etc/passwd
文件中。该文件中的每一行代表一个用户的登录信息。要打开该文件,你可以使用cat
或less
。
less /etc/passwd
文件中的每一行都有七个以冒号为界的字段,其中包含以下信息。
- 用户的名字。
- 加密的密码(
x
表示密码存储在/etc/shadow
文件中)。 - 用户ID号(UID)。
- 用户的组ID号(GID)。
- 用户的全名(GECOS)。
- 用户的主目录。
- 登录shell(默认为
/bin/bash
)。
如果你想只显示用户名,你可以使用awk
或cut
命令,只打印包含用户名的第一个字段。
awk -F: '{ print $1}' /etc/passwd
cut -d: -f1 /etc/passwd
输出
root
daemon
bin
sys
sync
...
...
sshd
vagrant
jack
anne
使用getent命令获取所有用户的列表
getent
命令显示在/etc/nsswitch.conf
文件中配置的数据库中的条目,包括passwd
数据库,它可以用来查询所有用户的列表。
要获得所有Linux用户的列表,请输入下面的命令。
getent passwd
正如你所看到的,输出结果与显示/etc/passwd
文件的内容时相同。如果你使用LDAP进行用户认证,getent
将显示/etc/passwd
文件和LDAP数据库中的所有Linux用户。
你也可以使用awk
或cut
,只打印包含用户名的第一个字段。
getent passwd | awk -F: '{ print $1}'
getent passwd | cut -d: -f1
检查一个用户是否存在于Linux系统中
现在我们知道了如何列出所有的用户,为了检查一个用户是否存在于我们的Linux盒子里,我们可以简单地通过管道将用户列表输送到grep
命令来过滤用户列表。
例如,要想知道在我们的Linux系统中是否存在一个名字为jack
的用户,我们可以使用以下命令。
getent passwd | grep jack
如果用户存在,上面的命令将打印用户的登录信息。没有输出,说明用户不存在。
我们也可以在不使用grep
命令的情况下检查一个用户是否存在,如下所示。
getent passwd jack
和以前一样,如果用户存在,该命令将显示用户的登录信息。
如果你想知道你的系统有多少个用户账户,用管道将getent passwd
的输出接到wc
的命令上。
getent passwd | wc -l
输出
33
从上面的输出结果可以看出,我的Linux系统有33个用户账户。
系统和普通用户
系统用户和普通(正常)用户之间没有真正的技术区别。通常,系统用户是在安装操作系统和新软件包时创建的。在某些情况下,你可以创建一个系统用户,该用户将被一些应用程序使用。
普通用户是指由root或其他具有sudo权限的用户创建的用户。通常,一个普通用户有一个真正的登录shell和一个主目录。
每个用户都有一个数字的用户ID,称为UID。如果在用useradd
命令创建一个新用户时没有指定,UID将根据UID_MIN
和UID_MAX
的值从/etc/login.defs
文件中自动选择。
要检查你系统上的UID_MIN
和UID_MAX
值,你可以使用下面的命令。
grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
输出
UID_MIN 1000
UID_MAX 60000
从上面的输出中,我们可以看到,所有正常用户的UID应该在1000到60000之间。知道了最小值和最大值,我们就可以查询到我们系统中所有正常用户的列表。
下面的命令将列出我们的Linux系统中的所有正常用户。
getent passwd {1000..60000}
输出
vagrant:x:1000:1000:vagrant,,,:/home/vagrant:/bin/bash
jack:x:1001:1001:,,,:/home/jack:/bin/bash
anne:x:1002:1002:Anne Stone,,,:/home/anne:/bin/bash
patrick:x:1003:1003:Patrick Star,,,:/home/patrick:/usr/sbin/nologin
你的系统的UID_MIN
和UID_MIN
值可能不同,所以上面的命令的更通用版本是。
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)}
如果你想只打印用户名,只需用管道将输出转到cut
命令中。
eval getent passwd {$(awk '/^UID_MIN/ {print $2}' /etc/login.defs)..$(awk '/^UID_MAX/ {print $2}' /etc/login.defs)} | cut -d: -f1
总结
在本教程中,你学会了如何在Linux系统中列出和过滤用户,以及系统用户和普通Linux用户之间的主要区别是什么。
同样的命令适用于任何Linux发行版,包括Ubuntu、CentOS、RHEL、Debian、和Linux Mint。
如果您有任何问题,请随时留言咨询。