在Linux系统中,用户名是标识系统用户身份的核心信息,无论是日常操作、脚本编写还是系统管理,经常需要获取当前或指定用户的用户名,Linux提供了多种命令和方法来显示用户名,涵盖基础命令、环境变量、系统文件等多个层面,下面将详细介绍这些方法及其使用场景。

基础命令直接显示用户名
whoami命令
whoami是最直接、最常用的显示当前用户名的命令,它无需任何参数,输出即为当前登录用户的用户名,该命令实际上是id -un的简化形式,通过调用id命令并指定-un参数(仅显示用户名)实现。
示例:  
$ whoami root
适用场景:快速确认当前登录用户身份,适合交互式操作或简单脚本。
id命令
id命令用于显示用户的用户ID(UID)、组ID(GID)及所属组信息,通过参数可以灵活提取用户名。  
id -un:仅显示用户名(-u表示UID,-n表示显示名称而非数字)。id -gn:仅显示主组名。
示例:$ id -un root $ id -gn root
适用场景:需要同时获取用户ID、组ID等信息时,比
whoami更灵活,适合脚本中精确提取用户名。
通过环境变量获取用户名
Linux在用户登录时会自动设置一组环境变量,其中包含用户名信息,无需调用命令即可直接引用。
$USER变量
$USER是最常用的用户名环境变量,由登录shell(如bash、zsh)在初始化时设置,表示当前登录用户的用户名。
示例:  
$ echo $USER root
适用场景:在shell脚本中直接引用,无需额外命令开销,效率较高。
$LOGNAME变量
$LOGNAME与$USER功能类似,也表示当前登录用户的用户名,但其来源可能因系统配置略有不同(例如某些系统通过login程序设置),在大多数情况下,$USER和$LOGNAME的值相同。
示例:  
$ echo $LOGNAME root
适用场景:与$USER类似,但某些特殊场景(如远程登录或特定服务启动时)可能需要优先检查$LOGNAME。

$USERNAME变量
$USERNAME并非所有Linux系统都默认设置,部分发行版(如某些基于Debian的系统)或特定应用(如SSH客户端)可能会定义该变量,功能与前两者一致,但通用性较低。
示例:  
$ echo $USERNAME root # 若系统未定义,可能无输出或报错
适用场景:仅在确认系统或应用已定义该变量时使用,避免兼容性问题。
从系统文件中提取用户名
Linux的用户信息存储在/etc/passwd文件中,该文件记录了所有用户的用户名、UID、家目录、登录Shell等核心信息,通过解析该文件,可以获取指定或所有用户的用户名。
查看/etc/passwd文件格式
/etc/passwd每行代表一个用户,字段以冒号()分隔,格式为:用户名:密码:UID:GID:描述:家目录:Shell
root:x:0:0:root:/root:/bin/bash  
提取当前用户名
结合grep和awk命令,可以从/etc/passwd中提取当前用户的用户名:  
$ grep "^$(id -un):" /etc/passwd | awk -F: '{print $1}'
root
说明:^$(id -un):匹配以当前用户名开头的行,-F:指定冒号为分隔符,{print $1}输出第一个字段(用户名)。
列出所有用户名
若需获取系统所有用户的用户名(包括系统用户),可直接提取/etc/passwd的第一个字段:  
$ awk -F: '{print $1}' /etc/passwd
root
daemon
bin
sys
...
适用场景:需要批量处理用户信息(如统计用户数量、筛选特定用户)时,适合脚本或系统管理任务。
通过系统日志与进程信息获取用户名
last命令
last命令显示用户的登录历史,每行记录包含用户名、登录终端、登录时间等信息,其中第一列即为用户名。
示例:  

$ last -n 5 # 显示最近5条登录记录 root pts/0 2023-10-01 10:00 still logged in user1 pts/1 2023-10-01 09:30 - 09:45 (00:15)
适用场景:查看历史登录用户,适合审计或排查登录问题。
w或who命令
w命令显示当前登录用户及其活动信息,第一列为用户名;who命令功能类似,但输出更简洁。
示例:  
$ w 10:00:01 up 1 day, 3:30, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.1.100 10:00 1:00 0.05s 0.05s bash user1 pts/1 192.168.1.101 09:30 15:00 0.10s 0.10s vim
适用场景:查看当前在线用户及其活动状态,适合实时监控。
ps命令
ps命令显示进程信息,通过-eo参数可以自定义输出格式,包括进程所属用户名。
示例:  
$ ps -eo user,pid,cmd root 1 /sbin/init root 2 [kthreadd] root 3 [rcu_gp] user1 1234 /usr/bin/vim
适用场景:查看特定用户运行的进程,适合排查进程相关问题。
常用方法总结对比
为方便快速选择合适的方法,以下表格总结了主要显示用户名命令的功能、特点及适用场景:
| 命令/方法 | 功能描述 | 示例命令 | 适用场景 | 
|---|---|---|---|
whoami | 
显示当前登录用户名 | whoami | 
交互式操作、快速确认 | 
id -un | 
通过UID显示用户名 | id -un | 
需要结合UID/GID的脚本 | 
echo $USER | 
通过环境变量显示用户名 | echo $USER | 
shell脚本、直接引用变量 | 
awk -F: '{print $1}' /etc/passwd | 
从系统文件提取所有用户名 | awk -F: '{print $1}' /etc/passwd | 
批量处理用户信息 | 
last -n 1 | 
显示最近登录的用户名 | last -n 1 | awk '{print $1}' | 
查看登录历史 | 
w | 
显示当前在线用户名及活动 | w | awk '{print $1}' | 
实时监控在线用户 | 
适用场景总结
- 日常操作:直接使用
whoami或echo $USER,简单高效。 - 脚本编写:优先选择
id -un或$USER,兼顾灵活性和效率;若需批量处理用户,则解析/etc/passwd。 - 系统管理:通过
last、w、ps等命令结合用户名进行审计、监控或进程管理。 
相关问答FAQs
Q1: 如何查看当前登录系统的所有用户名?
A1: 可以通过who、w或users命令查看当前在线用户名,或通过awk -F: '{print $1}' /etc/passwd查看所有系统用户名(包括离线用户)。  
$ who # 显示当前登录用户及终端信息 root pts/0 2023-10-01 10:00 user1 pts/1 2023-10-01 09:30
Q2: 为什么whoami和echo $USER显示的结果可能不同?
A2: 通常两者结果一致,但在特殊场景下可能不同:  
- 使用
su命令切换用户时,whoami显示当前切换后的用户名,而$USER可能仍为原始登录用户名(取决于su的选项,如su -会重新加载环境变量,使两者一致)。 - 在非交互式shell(如脚本中直接调用
su)或某些特殊服务启动时,环境变量可能未正确更新,导致$USER滞后于实际用户身份,此时建议优先使用whoami或id -un获取准确用户名。 
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/26042.html