一、查看系统用户
1.查看所有用户
方法A:查看/etc/passwd文件(最常用)
$cat/etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync alice:x:1000:1000:Alice Smith,,,:/home/alice:/bin/bash bob:x:1001:1001:Bob Johnson:/home/bob:/bin/bash字段解释(以alice:x:1000:1000:Alice Smith,,,:/home/alice:/bin/bash为例):
- 用户名:
alice - 密码占位符:
x(实际密码在/etc/shadow) - UID:
1000(用户ID) - GID:
1000(主组ID) - 用户信息:
Alice Smith,,,(全名、电话等) - 家目录:
/home/alice - 登录shell:
/bin/bash
方法B:使用getent命令
$ getentpasswdroot:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin...方法C:提取用户名列表
$cut-d: -f1 /etc/passwd root daemon bin sys alice bob# 或使用awk$awk-F:'{print$1}'/etc/passwd root daemon bin sys alice bob2.查看当前登录用户
# 查看当前登录的用户及终端信息$whoalice pts/02024-04-1510:00(192.168.1.100)bob pts/12024-04-15 09:30(192.168.1.101)# 查看当前登录用户及活动$ w10:15:00 up5days,2:30,2users, load average:0.08,0.03,0.01USERTTY FROM LOGIN@ IDLE JCPU PCPU WHAT alice pts/0192.168.1.10010:001.00s0.05s0.00s w bob pts/1192.168.1.101 09:305:000.10s0.02stop# 只显示当前用户名$whoamialice $logname# 显示登录时的用户名alice# 显示所有登录的用户名$usersalice bob3.查看特定用户信息
# 查看用户的UID、GID和所属组$idaliceuid=1000(alice)gid=1000(alice)groups=1000(alice),10(wheel),20(docker)# 查看用户的详细信息(需要安装finger包)$sudoaptinstallfinger# 安装finger工具$ finger alice Login: alice Name: Alice Smith Directory: /home/alice Shell: /bin/bash On since Mon Apr1510:00(CST)on pts/0 from192.168.1.1003minutes idle No mail. No Plan.# 查看用户的登录历史$ last alice alice pts/0192.168.1.100 Mon Apr1510:00 still loggedinalice pts/0192.168.1.100 Sun Apr1409:30 -18:00(08:30)# 查看用户密码状态$passwd-S alice alice P 04/01/20240999997-1# P表示密码可用,L表示锁定,NP表示无密码二、查看系统用户组
1.查看所有用户组
方法A:查看/etc/group文件
$cat/etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,alice sudo:x:27:alice,bob alice:x:1000: bob:x:1001: docker:x:999:alice字段解释(以sudo:x:27:alice,bob为例):
- 组名:
sudo - 密码占位符:
x(组密码在/etc/gshadow) - GID:
27(组ID) - 组成员:
alice,bob
方法B:使用getent命令
$ getent group root:x:0: daemon:x:1: sudo:x:27:alice,bob...方法C:提取组名列表
$cut-d: -f1 /etc/group root daemon bin syssudoalice2.查看用户所属的组
# 查看当前用户所属的所有组$groupsalice wheel docker# 查看指定用户所属的所有组$groupsalice alice:alice wheel docker# 查看指定用户的详细组信息$idaliceuid=1000(alice)gid=1000(alice)groups=1000(alice),10(wheel),20(docker)# 显示:用户alice的UID=1000,主组GID=1000,附加组:wheel(10), docker(20)# 查看用户的主要组$id-gn alice# 组名alice $id-g alice# GID1000# 查看用户的附加组$id-Gn alice# 所有组名alice wheel docker $id-G alice# 所有GID100010203.查看组的详细信息
# 查看特定组的成员$ getent groupsudosudo:x:27:alice,bob,charlie# 或使用grep$grep^sudo: /etc/group sudo:x:27:alice,bob,charlie# 查看所有组及其成员(格式化输出)$forgroupin$(cut-d: -f1 /etc/group);doecho"组:$group"members=$(getent group $group|cut-d: -f4)[-n"$members"]&&echo"成员:$members"||echo"成员: 无"echo"---"done组: root 成员: 无 组:sudo成员: alice,bob,charlie 组: alice 成员: 无三、高级查看技巧
1.区分系统用户和普通用户
# 查看系统用户(UID < 1000)$awk-F:'$3< 1000 {print$1,$3}'/etc/passwd root0daemon1bin2sys3# 查看普通用户(UID >= 1000)$awk-F:'$3>= 1000 {print$1" (UID:"$3")"}'/etc/passwd alice(UID:1000)bob(UID:1001)charlie(UID:1002)# 统计用户数量$echo"系统用户数:$(awk-F:'$3< 1000'/etc/passwd|wc-l)"系统用户数:38$echo"普通用户数:$(awk-F:'$3>= 1000'/etc/passwd|wc-l)"普通用户数:32.查看用户登录shell
# 查看所有用户及其shell$awk-F:'{printf "%-10s %-15s\n",$1,$7}'/etc/passwd root /bin/bash daemon /usr/sbin/nologin bin /usr/sbin/nologin alice /bin/bash bob /bin/zsh# 查看使用bash的用户$grep'/bin/bash$'/etc/passwd|cut-d: -f1 root alice# 查看使用nologin的用户(服务账户)$grep'/usr/sbin/nologin$'/etc/passwd|cut-d: -f1 daemon bin sys3.查看无密码的用户
# 查看密码字段为空的用户$sudoawk-F:'$2== "" {print$1}'/etc/shadow# 或者$sudogrep'^[^:]*::'/etc/shadow|cut-d: -f1# 查看密码已过期的用户$sudochage -l alice|grep"Password expires"Password expires:never# 使用passwd命令查看$sudopasswd-Sa|grep-E"NP|LK"# NP表示无密码,LK表示锁定4.查看用户家目录
# 查看所有用户及其家目录$awk-F:'{printf "%-10s -> %s\n",$1,$6}'/etc/passwd root ->/root daemon ->/usr/sbin bin ->/bin alice ->/home/alice bob ->/home/bob# 检查家目录是否存在$foruserin$(cut-d: -f1 /etc/passwd);dohome=$(getentpasswd$user|cut-d: -f6)if[!-d"$home"];thenecho"警告: 用户$user的家目录$home不存在"fidone四、组合查询实用示例
示例1:查看所有sudo组成员
$ getent groupsudo|cut-d: -f4|tr',''\n'alice bob charlie# 或者查看详细信息$foruserin$(getent groupsudo|cut-d: -f4|tr','' ');doecho"用户:$user"id$userecho"---"done用户: aliceuid=1000(alice)gid=1000(alice)groups=1000(alice),10(wheel),27(sudo),999(docker)---示例2:查看用户最近登录时间
# 查看所有用户的最后登录时间$ lastlog 用户名 端口 来自 最后登录时间 root **从未登录** daemon **从未登录** bin **从未登录** alice pts/0192.168.1.100 一4月1510:00:00 +08002024bob pts/1192.168.1.101 一4月1509:30:00 +08002024# 查看特定用户的登录历史$ last -F alice|head-5 alice pts/0192.168.1.100 Mon Apr1510:00:002024still loggedinalice pts/0192.168.1.100 Sun Apr1409:30:002024-18:00:002024(08:30)示例3:检查用户配置问题
# 检查UID重复的用户$awk-F:'{print$3}'/etc/passwd|sort-n|uniq-d# 检查没有家目录的用户$awk-F:'($6== "" ||$6!~ /^\//) {print$1": "$6}'/etc/passwd# 检查无效的shell$awk-F:'system("[ -f\""$7"\"]")'/etc/passwd示例4:生成用户报告
#!/bin/bash# 生成系统用户报告echo"=== 系统用户报告 ==="echo"生成时间:$(date)"echo""echo"1. 用户统计:"echo"总用户数:$(wc-l</etc/passwd)"echo"系统用户:$(awk-F:'$3< 1000'/etc/passwd|wc-l)"echo"普通用户:$(awk-F:'$3>= 1000'/etc/passwd|wc-l)"echo""echo"2. 最近创建的用户:"ls-lt /home2>/dev/null|head-5echo""echo"3. 拥有sudo权限的用户:"foruserin$(getent groupsudo|cut-d: -f4|tr',''\n');doecho" -$user(UID:$(id-u $user))"doneecho""echo"4. 当前登录用户:"whoecho""echo"5. 用户登录shell分布:"cut-d: -f7 /etc/passwd|sort|uniq-c|sort-rn五、图形界面工具
如果系统有图形界面,也可以使用GUI工具:
# GNOME桌面环境$ gnome-system-tools# 需要安装# 或使用$sudoaptinstallgnome-system-tools $ users-admin# KDE桌面环境$ kuser# 用户管理器# 所有桌面通用的简单工具$ system-config-users# 需要安装$sudoaptinstallsystem-config-users六、实用命令速查表
| 命令 | 功能 | 示例 |
|---|---|---|
cat /etc/passwd | 查看所有用户 | cat /etc/passwd | grep alice |
cat /etc/group | 查看所有组 | cat /etc/group | grep sudo |
getent passwd | 查看所有用户(包括网络用户) | getent passwd alice |
getent group | 查看所有组(包括网络组) | getent group sudo |
id [用户名] | 查看用户详细信息 | id alice |
groups | 查看当前用户的组 | groups |
who | 查看当前登录用户 | who |
w | 查看登录用户及活动 | w |
last | 查看登录历史 | last alice |
lastlog | 查看所有用户最后登录时间 | lastlog |
users | 查看所有登录用户名 | users |
whoami | 查看当前用户名 | whoami |
logname | 查看登录用户名 | logname |
finger [用户] | 查看用户详情 | finger alice |
cut -d: -f1 /etc/passwd | 提取用户名列表 | cut -d: -f1 /etc/passwd |
awk -F: '{print $1}' | 提取用户名列表 | awk -F: '{print $1}' /etc/passwd |
七、安全审计相关
# 查看空密码用户$sudoawk-F:'($2== "") {print$1}'/etc/shadow# 查看UID为0的用户(除了root不应有其他用户)$awk-F:'$3== 0 {print$1}'/etc/passwd root# 如果还有其他用户,可能存在安全问题# 查看无登录shell的用户(服务账户)$grep-E"/false$|/nologin$"/etc/passwd|wc-l# 查看最近修改密码的用户$ls-lt /etc/shadow八、常用脚本示例
1. 快速查看用户信息
#!/bin/bash# userinfo.sh - 查看用户详细信息if[-z"$1"];thenecho"用法:$0用户名"exit1fiUSERNAME=$1echo"=== 用户$USERNAME的详细信息 ==="echo""# 检查用户是否存在if!id"$USERNAME"&>/dev/null;thenecho"错误: 用户$USERNAME不存在"exit1fiecho"1. 基本信息:"id"$USERNAME"echo""echo"2. 密码信息:"sudopasswd-S"$USERNAME"2>/dev/null||echo"(需要sudo权限查看)"echo""echo"3. 家目录:"HOME_DIR=$(getentpasswd"$USERNAME"|cut-d: -f6)echo"目录:$HOME_DIR"if[-d"$HOME_DIR"];thenecho"大小:$(du-sh"$HOME_DIR"|cut-f1)"echo"权限:$(ls-ld"$HOME_DIR")"elseecho"警告: 家目录不存在"fiecho""echo"4. 登录shell:"getentpasswd"$USERNAME"|cut-d: -f7echo""echo"5. 最后登录:"last"$USERNAME"|head-3echo""echo"6. 所属组:"groups"$USERNAME"2. 批量导出用户信息
#!/bin/bash# export-users.sh - 导出所有用户信息到CSVOUTPUT_FILE="users_$(date+%Y%m%d).csv"echo"用户名,UID,GID,全名,家目录,Shell,主组,附加组">"$OUTPUT_FILE"whileIFS=:read-r username password uid gid fullname homedir shell;do# 跳过系统用户(UID < 1000)if["$uid"-ge1000];thenprimary_group=$(id-gn"$username")supplementary_groups=$(id-Gn"$username"|sed"s/$primary_group//")# 转义CSV中的逗号fullname=$(echo"$fullname"|sed's/,/;/g')echo"$username,$uid,$gid,$fullname,$homedir,$shell,$primary_group,$supplementary_groups">>"$OUTPUT_FILE"fidone</etc/passwdecho"用户信息已导出到:$OUTPUT_FILE"总结
通过以上命令和技巧,你可以:
- ✅ 查看所有用户和组- 使用
/etc/passwd和/etc/group - ✅ 查看特定用户信息- 使用
id、finger、groups等命令 - ✅ 区分系统用户和普通用户- 通过UID判断(<1000为系统用户)
- ✅ 监控用户活动- 使用
who、w、last等命令 - ✅ 进行安全审计- 检查空密码、异常UID等
- ✅ 批量处理用户信息- 使用脚本自动化
查看用户和组信息是Linux系统管理的基础技能,熟练掌握这些命令对于日常管理和故障排除非常重要。