本地用户信息存储在文件/etc/passwd。文件中的每一行代表一个用户的登录信息。要查看/etc/passwd文件,您可以使用cat或less命令。
less /etc/passwd
从命令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
…
getent 命令列出所有用户
getent命令打印来自/etc/nsswitch.conf文件中配置的数据库的条目,包括passwd数据库,我们可以用来列出所有用户。
要获取所有Linux用户的列表,请运行命令getent passwd。您也可以使用awk或cut仅打印用户名的第一列。
如您所见,输出与查看/etc/passwd文件的内容时相同。如果您使用LDAP进行用户身份验证,则getent将打印/etc/passwd文件和LDAP数据库中的所有Linux用户。
getent passwd
getent passwd | awk -F: ‘{ print $1}’
getent passwd | cut -d: -f1
Linux 检查用户是否存在
现在,我们知道了如何列出所有用户,要检查Linux是否存在用户,我们可以将用户列表传递给grep命令来简单地过滤用户列表,确认是否存在用户。
例如,要确定我们的Linux系统是否存在名为cnraksmart的用户,运行命令getent passwd | grep cnraksmart。
如果用户存在,命令将打印用户的登录信息。如果没有输出,则表示该用户不存在。
getent passwd | grep cnraksmart
我们还可以在不使用grep命令检查用户是否存在,例如命令getent passwd cnraksmart。
与命令getent passwd | grep cnraksmart相同,如果用户存在,命令将显示用户的登录信息。
除了检查用户是否存在之外你可能还想列出Linux 系统有多少个用户。例如命令getent passwd | wc -l将会统计所有用户。
getent passwd cnraksmart
getent passwd | wc -l
33
系统用户和普通用户
系统与普通用户之间没有真正的技术区别。通常,系统用户是在安装操作系统创建的用户。在某些情况下,您可能需要创建用户运行指定的应用程序。
普通用户是由root用户创建的用户。通常,普通用户具有真实的登录shell和家目录。
每个用户都有一个称为UID的用户数字ID。如果在使用useradd命令创建用户时未指定,则系统将根据UID_MIN和UID_MIN值从/etc/login.defs文件中自动选择UID。
要检查系统的UID_MIN和UID_MIN值,可以运行命令grep -E ‘^UID_MIN|^UID_MAX’ /etc/login.defs。
grep -E ‘^UID_MIN|^UID_MAX’ /etc/login.defs
UID_MIN 1000
UID_MAX 60000
从命令输出中,我们可以看到所有普通用户的UID应该在1000到60000之间。知道最小值和最大值后,我们就可以查询系统中所有普通用户的列表。
例如命令getent passwd {1000..60000}将列出Linux 所有普通用户。您的系统UID_MIN和UID_MIN值可能不同。
如果不想将列出所有普通用户,分成两个步骤。可以组合两个命令到一个命令中。
eval getent passwd {$(awk ‘/^UID_MIN/ {print $2}’ /etc/login.defs)..$(awk ‘/^UID_MAX/ {print $2}’ /etc/login.defs)}
你将活得同样的结果,在一个命令中。如果只想打印用户名,只需将输出通过管道传递到cut命令:
getent passwd {1000..60000}
eval getent passwd {$(awk ‘/^UID_MIN/ {print $2}’ /etc/login.defs)..$(awk ‘/^UID_MAX/ {print $2}’ /etc/login.defs)}
eval getent passwd {$(awk ‘/^UID_MIN/ {print $2}’ /etc/login.defs)..$(awk ‘/^UID_MAX/ {print $2}’ /etc/login.defs)} | cut -d: -f1
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