我们如何在Linux上获取非系统用户列表?

13

考虑到所有带有 id >= 1000 的用户都是非系统用户,我们该如何在一个命令中获取这些用户的列表?


除非涉及主要用于编程的工具,否则有关计算机硬件和软件的一般问题在Stack Overflow上是不适合的。您可以在Super User上获得帮助。 - m.s.
4
@m.s.,这个问题被标记为[bash]和[shell],并且对于带有这些标签的SO问题来说并不不寻常或不合适。 “使用什么命令来执行X”确实是bash的一个编程问题。 - John Bollinger
6个回答

20

您需要获取所有gid大于或等于1000的用户。请使用以下命令:

awk -F: '($3>=1000)&&($1!="nobody"){print $1}' /etc/passwd

如果您想要系统用户(gid<1000),则为:

awk -F: '($3<1000){print $1}' /etc/passwd

这对我没有用 - libvirt-qemu 安装时的 GID 是 64055。我留下了一个答案,展示如何忽略像 libvirt-qemu 这样的系统用户:https://dev59.com/YlwX5IYBdhLWcg3w-Tlv#62051801 - Nick ODell

7
您可以使用awk来完成这个任务:
awk -F: '$3 >= 1000' /etc/passwd

这将通过冒号拆分/etc/passwd文件,然后如果第3个字段(用户ID)大于或等于1000,则打印整个/etc/passwd记录。
如果你只想从这个列表中获取用户名,则:
awk -F: '$3 >= 1000 {print $1}' /etc/passwd

其中$1是/etc/passwd文件的第一个字段,即用户名。


1
系统用户(应该)是在/etc/passwd中列出的UID小于1000的用户。实际数字仅是一种惯例。非系统用户不需要在此列出。您可以使用getentawk获取列表,忽略"nobody"(也是一种惯例):
getent passwd |awk -F : '$3 >= 1000 && $3 < 65534'

1
假设系统只识别本地用户(即那些在/etc/passwd中记录的用户,而不是通过远程服务(如LDAP、NIS或Winbind)进行身份验证的用户),您可以使用grepsedawk/etc/passwd中提取数据。其中,awk最为灵活,但是您是否考虑过使用sed来解决问题呢?
sed -n '/^\([^:]\+\):[^:]\+:[1-9][0-9]\{3\}/ { s/:.*//; p }' /etc/passwd

1

您需要忽略小于1000的GID,同时也要忽略大于60000的GID。Ubuntu/Debian将这些保留给各种系统服务。

awk -F: '($3>=1000)&&($3<60000)&&($1!="nobody"){print $1}' /etc/passwd

0

以下是使用Ansible和awk所有机器上执行此操作的答案,基于JNevill的回答:

ansible -i inventories/cd_staging all -m shell -a "awk -F: '\$3 >= 1000 && \$7 \!~ /nologin/ {print \$1}' \/etc\/passwd |sort"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接