logname 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
logname——系统信息/用户相关命令族(见系统信息与用户命令族)。它和 whoami 长得像,但有一个关键区别:su 之后它不变。
logname 打印最初登录这次会话的用户名,而不是"当前有效用户"。
一、基本用法
bash
logname # 输出你登录时用的用户名,如 alice
whoami # 对比:输出当前有效用户表面看和 whoami 一样,但差异在 su 之后显现:用
su bob切到 bob,whoami 变成 bob,而logname仍是你最初登录的 alice。
二、logname vs whoami vs $USER
| 命令/变量 | 含义 | su 之后 |
|---|---|---|
logname | 初始登录用户 | 不变(仍是原登录人) |
| whoami | 当前有效用户(euid) | 变成 bob |
$USER | 通常等于 whoami | 随 su 变 |
关键区别:
logname读的是登录时的 utmp 记录,反映"谁开的这个会话";whoami 看的是当前进程的有效 UID,反映"现在以谁的身份在跑"。审计"真实操作人"时用 logname 更准。
三、踩坑:无登录会话时失效
bash
# 在 cron、某些脚本、容器里可能没有 utmp 登录记录
logname # 可能报错:logname: no login namelogname 依赖系统的 utmp 登录数据库。cron 任务、部分容器、管道调用场景下没有有效登录记录,logname 会报错。这种环境要拿用户,退而用
$USER或id -un(见id 命令详解)。
四、实战:记录真实操作人
bash
# 在运维脚本里记日志,标注"谁触发"
echo "$(logname) 执行了数据清理 @ $(date)" >> /var/log/ops.log哪怕中间 su 过,logname 仍能把最初登录人记下来,便于事后追责。比 whoami 更适合"审计真实来源"的场景。
五、配合 id 取更多信息
bash
logname # 登录名
id -un # 当前有效用户名(见 id /linux/cmd/id.md)一句话总结
logname = 显示初始登录用户名:和 whoami 不同,它不受 su 影响,反映"谁开的会话",适合审计真实操作人;但无 utmp 记录的环境(cron/容器)会报错,那种情况用 $USER 或 id。