zsh 扩展历史解析
zsh 开启 EXTENDED_HISTORY 后,历史条目形如「: 起始秒:耗时;命令」,条目本身携带命令的开始时间与执行时长,比单纯的行列表更有分析价值。解析后可并入时间线,用来确认命令执行与日志事件是否对得上。
基本信息
| 文件位置 | ~/.zsh_history,每个用户各一份 |
|---|---|
| 条目格式 | : 起始秒:耗时;命令 |
| 开启方式 | 在 .zshrc 中设置 EXTENDED_HISTORY 选项 |
| 相关变量 | HISTFILE、HISTSIZE、SAVEHIST |
| 其它位置 | root 与服务账号家目录下另有独立文件 |
| 时间口径 | 起始时间为 Unix 秒,换算后再并入时间线 |
典型使用场景
- 还原命令执行的时刻与耗时
- 与认证日志配合确认会话内的动作
- 判断长时间运行任务所处的时间窗
- 对比多个账号的命令使用差异
- 排查持久化脚本被手工执行的痕迹
最小示例
最小示例
grep '^: ' ~/.zsh_history | head # 只看带时间戳的条目
awk -F'[:;]' '/^: /{print $2, $4}' ~/.zsh_history | head # 提取起始秒与命令
awk -F'[:;]' '/^: /{print strftime("%F %T", $2), $4}' ~/.zsh_history | tail -20
wc -l ~/.zsh_history # 记录条目总数
stat -c '%n mtime=%y ctime=%z' ~/.zsh_history # 文件时间戳
ls -l --time-style=long-iso /root/.zsh_history 2>/dev/null要素与解读
| 要素 | 含义 | 注意 |
|---|---|---|
| 起始秒 | 命令开始时间(Unix 秒) | 需换算为可读时间并统一时区 |
| 耗时 | 命令执行秒数 | 可用于识别长时间任务 |
| 命令 | 完整命令行 | 含敏感参数时按规则脱敏 |
| 文件 mtime | 历史最后写入时间 | 辅助判断会话活跃期 |
| 条目总数 | 历史长度 | 受 HISTSIZE 与 SAVEHIST 限制 |
bash 的历史时间戳是另一种形式,以时间注释行呈现,与 zsh 的条目格式完全不同,不要用同一套解析规则处理。
root 与服务账号使用 zsh 时历史存放在各自家目录,只看普通用户会漏掉提权之后的命令记录。
与审计日志配合使用效果更好:审计记录带 pid 与 tty,历史条目只有时间与文本,两者对照才能判断同一时刻是哪个会话在执行。
历史内容可能包含口令、令牌等敏感参数,写进报告或截图之前必须先按脱敏规则处理。