有没有一个命令可以列出所有用户?还有在终端中添加、删除、修改用户的命令吗?

我需要一个命令来列出所有用户,以及添加、删除和修改用户的命令,这些命令可以帮助通过终端轻松管理用户账户。

6s/\:.*// - Avinash Raj
5列出用户:awk -F: '{ print $1 }' /etc/passwd - saviour123
在Ubuntu默认情况下使用bash:grep bash /etc/passwd | cut -d: -f1 - S2L
10个回答

列出清单

要列出所有本地用户,您可以使用以下命令:

cut -d: -f1 /etc/passwd

要列出所有能够进行身份验证的用户(以某种方式),包括非本地用户,请参阅this reply
一些更有用的用户管理命令(也仅限于本地用户):

添加

要添加新用户,您可以使用以下命令:
sudo adduser new_username

或者:

sudo useradd new_username

另请参阅: adduser和useradd之间的区别是什么?

删除用户

要删除用户,首先可以使用以下命令:

sudo userdel username

如果您想删除已删除用户帐户的主目录:

sudo rm -r /home/用户名

请谨慎使用上述命令!

修改

要修改用户的用户名:

usermod -l new_username old_username

更改用户密码:
sudo passwd username

更改用户的shell:
sudo chsh username

更改用户的详细信息(例如真实姓名):
sudo chfn username

将用户添加到sudo组:
adduser username sudo

或者

usermod -aG sudo username

当然,还可以参考:man adduserman useraddman userdel等等。

14Radu忘了提到sudo chfn <用户名>,这会更改用户详细信息(例如真实姓名)。我试图将此作为评论添加,但是收到错误提示,告诉我必须拥有+50声望才能这样做。 - Aminda
2我认为应该强调一下,链接问题的正确答案是http://askubuntu.com/a/381646/16395 --- 否则你必须手动考虑GID/UID Ubuntu政策。被接受的答案并不那么清楚。 - Rmano
使用sudo userdel DOMAIN\johndoe命令时出现错误:“userdel: 无法从/etc/passwd中删除条目'DOMAIN\johndoe' -- 我查看了/etc/passwd,甚至没有找到他们,可能是因为这是一个“域”账户?” - 00fruX
1@00fruX 是的...如果你正在使用集中式用户数据库,你需要直接处理它。 - Oli
如果猫返回了“拒绝访问/etc/passwd”错误,即使这发生在根账户上,会怎么样? - Overmind
你可以让这个更长一些,并排除用户nobody,但是在上面的list命令中添加以下内容以获取你创建的本地用户(>= 1000):cut -d: -f1,3 /etc/passwd | grep -P '\d{4,}$' - bksunday
因为这个答案,我学到了关于cut命令的用法(使用man cut)。 - Robert Dundon
要删除用户及其主目录,可以使用 sudo deluser --remove-home <用户名>sudo rm -r /home/username 不仅危险,因为您可能会因为拼写错误而轻易地删除错误的目录,而且它也不一定要以要删除的用户命名(请参见 /etc/passwd)。 - stackprotector

只需按下键盘上的Ctrl+Alt+T,就可以打开终端。当它打开时,运行以下命令:
cat /etc/passwd

或者

less /etc/passwd
more /etc/passwd

你也可以使用awk:awk
awk -F':' '{ print $1}' /etc/passwd

如何通过命令添加用户? - nux
你可以使用useradd命令。 - Mitch
@nux 晚来了一点,但是从命令行使用adduser代替,useradd应该只限于那些作者真的非常了解自己在做什么的脚本。 - flindeberg

获取这种信息的最简单方法是使用getent命令 - 参见 getent命令的man页 Manpage icon。虽然该命令提供与cat /etc/passwd相同的输出,但它很有用,因为它会给出操作系统中多个元素的列表。

要获取所有用户的列表(因为用户在/etc/passwd中列出),请键入:

getent passwd

要将用户newuser添加到系统中,您需要输入以下命令
sudo adduser newuser

创建一个用户,并应用所有默认设置。
奖励:要将任何用户(例如anyuser)添加到组(例如cdrom),请键入
sudo adduser anyuser cdrom

你可以删除一个用户(例如过时的),使用以下方法:
sudo deluser obsolete

如果你想同时删除他的主目录/邮件,你可以输入以下命令:
sudo deluser --remove-home obsolete

sudo deluser --remove-all-files obsolete

将会删除用户该用户在整个系统上拥有的所有文件。

11记住,getent 不仅仅打印 /etc/passwd 中的用户输出,还会打印给定系统上所有配置的用户数据库后端中的所有用户,无论是 /etc/passwd 还是 LDAP 等等。 - Marcin Kaminski
1@MarcinKaminski是对的,它还会打印出在SSO系统中设置了访问服务器权限的用户。这个答案是最好的,使用getent passwd命令是正确的。 - ulkas
从所有可枚举的用户数据库后端中选择@MarcinKaminski。 - jrw32982
是的,你可以通过使用getent和/etc/passwd来找到用户。我在这篇文章中找到了相关内容:https://dev2devs.com/how-to-list-all-user-accounts-on-ubuntu-16-04-18-04/ - prasoon


这应该适用于大多数正常情况下的普通用户(非系统、非奇怪等):
awk -F'[/:]' '{if ($3 >= 1000 && $3 != 65534) print $1}' /etc/passwd

这个工作原理是:
  • /etc/passwd中读取
  • 使用:作为分隔符
  • 如果第三个字段(用户ID号码)大于1000且不等于65534,则打印第一个字段(用户的用户名)。
这是因为在许多Linux系统上,1000以上的用户名被保留给非特权(也可以说是普通)用户。关于此的一些信息在这里
用户ID(UID)是由类Unix操作系统分配给每个用户的唯一正整数。系统通过UID来识别每个用户,而用户名通常只用作人机接口。
UID与其对应的用户名和其他用户特定信息一起存储在/etc/passwd文件中...
第三个字段包含UID,第四个字段包含组ID(GID),对于所有普通用户,默认情况下GID等于UID。
在Linux内核2.4及以上版本中,UID是无符号32位整数,可以表示从零到4,294,967,296的值。然而,为了与使用旧内核或只能容纳16位UID的文件系统保持兼容性,建议仅使用最多65,534的值。
UID为0具有特殊角色:它始终是root账户(即全能管理员用户)。虽然可以更改此帐户的用户名并创建具有相同UID的其他帐户,但从安全角度来看,这两种操作都不明智。
UID 65534通常保留给nobody,一个没有系统特权的用户,与普通(非特权)用户相对。此UID经常用于通过FTP(文件传输协议)或HTTP(超文本传输协议)远程访问系统的个人。
UID 1至99传统上保留给特殊系统用户(有时称为伪用户),例如wheel、daemon、lp、operator、news、mail等。这些用户是不需要完全root权限的管理员,但他们执行一些管理任务,因此需要比普通用户更多的特权。
某些Linux发行版(即版本)从100开始为非特权用户分配UID。其他发行版,如Red Hat,从500开始,而Debian等则从1000开始。由于不同发行版之间的差异,在组织的网络中使用多个发行版时可能需要手动干预。
此外,为本地用户保留一块UID范围(例如1000到9999),并为远程用户(即网络上的其他用户)保留另一块范围(例如10000到65534)可能会很方便。重要的是决定一个方案并坚持遵守。
将数字块保留给特定类型的用户的这种做法的优点之一是,它使在系统日志中搜索可疑用户活动更加方便。
与流行观念相反,UID字段中的每个条目并不一定需要唯一。然而,非唯一的UID可能会引起安全问题,因此应该确保整个组织中的UID保持唯一。同样,尽可能避免对以前用户的UID进行回收利用。

2几乎完美的答案,但我认为使用getent而不是直接从/etc/passwd读取,并查找UID_MIN/UID_MAX而不是硬编码值更清晰一些:getent passwd | awk -F: "{if (\$3 >= $(awk '/^UID_MIN/ {print $2}' /etc/login.defs) && \$3 <= $(awk '/^UID_MAX/ {print $2}' /etc/login.defs)) print \$1}" - Max Truxa

列出所有可以登录的用户(不包括系统用户,如:bin、deamon、mail、sys等)。
awk -F':' '$2 ~ "\$" {print $1}' /etc/shadow

添加新用户
sudo adduser new_username

或者

sudo useradd new_username

删除/移除用户名
sudo userdel username

如果你想删除主目录(默认为目录/home/username)
sudo deluser --remove-home username

或者

sudo rm -r /path/to/user_home_dir

如果你想从系统中删除该用户的所有文件(不仅仅是主目录),请执行以下操作。
sudo deluser --remove-all-files

1也许你应该解释一下adduseruseradd之间的区别,并在第一个命令前添加sudo前缀。密码影子文件只能由root用户读取。 - s3lph
2awk -F':' '$2 ~ "\$" {print $1}' /etc/shadow 显示了所有用户,包括 bin、daemon 等,并且抛出了以下警告:转义序列 \$' 被视为普通的 $'。我在这篇帖子 https://stackoverflow.com/a/25867768/847954 中找到了解决方法,并添加了一个额外的反斜杠,问题得到了解决:awk -F':' '$2 ~ "\\$" {print $1}' /etc/shadow - jeff musk

好的,这里有一个技巧可以帮助你解决这个问题。终端有自动补全功能,如果你输入"user"并按两次Tab键,它将列出所有以"user"作为前4个字符的命令。
user (tab tab)

给我可能的选项 useradd userdel usermod users users-admin
如果你想了解更多关于一个命令的信息,可以谷歌一下或者输入 man man useradd 会给出 useradd - 创建一个新用户或更新默认新用户信息 ... ...

要列出用户,你应该按照Mitch说的去做。

希望这有所帮助,我喜欢在bash中使用制表符自动完成,这样就不用记住那些东西了。


这种方法可能在幕后使用compgen命令,可以参考这个答案:https://askubuntu.com/a/925312/830543 - gmarmstrong

要找出在机器上的/home文件夹中拥有家目录的用户,请运行以下命令。
cd /home
ls 

你可以查看被授权登录服务器的用户。如果我们想查看任何用户的文件,你必须是root用户。

10这只显示了/home的内容。虽然Ubuntu默认将用户目录放在那里,但这并不是强制性的。 - David Foerster
1ls /home可能还包含已删除用户的用户目录。 - Suraj

lslogins

lslogins (1) - 在系统中显示已知用户的信息

lslogins 是一个Linux命令,用于显示系统上已知用户的信息。它从各种来源(如/etc/passwd/etc/group和其他特定于系统的用户信息数据库)收集信息。该命令扫描wtmpbtmp日志,/etc/shadow(如果需要)和/etc/passwd文件,并输出所需的数据。可选的用户名参数可用于仅输出指定用户的信息。


第一个答案建议:
cut -d: -f1 /etc/passwd

但是使用这个方法并计算用户数量,您会得到:

$ cut -d: -f1 /etc/passwd | wc -l
46

46个用户对于一台笔记本电脑来说是很多的!所以请使用这个替代方案:
$ cat /etc/passwd | grep -vE '(/bin/false|/sbin/nologin|/bin/sync)' | cut -d: -f1
root
rick
guest-atkb2q
guest-u4sf2i
guest-rmlbtg
guest-mz53vp

删除访客账户(这些账户根本没有保存文件)请使用以下方法:
$ cat /etc/passwd | grep -vE '(/bin/false|/sbin/nologin|/bin/sync|guest-)' | cut -d: -f1
root
rick

一些从列表中删除的示例用户为:
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/bin/false
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
sync:x:4:65534:sync:/bin:/bin/sync
guest-atkb2q:x:999:999:Guest:/tmp/guest-atkb2q:/bin/bash

原来,在单用户系统中,大部分的用户实际上是将自己设置为用户的程序。