首页/安全/取证与溯源速查/zsh 扩展历史解析
Linux 取证135 条

zsh 扩展历史解析

zsh 开启 EXTENDED_HISTORY 后,历史条目形如 : 起始时间:耗时;命令,直接携带时间与执行时长,解析后可进时间线。

取证与溯源速查安全更新于 2026-10-13

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,历史条目只有时间与文本,两者对照才能判断同一时刻是哪个会话在执行。
历史内容可能包含口令、令牌等敏感参数,写进报告或截图之前必须先按脱敏规则处理。

易错点

  • 按固定分隔符粗暴切分:命令行里也可能含冒号与分号,解析应以行首的时间前缀为锚点
  • 只看普通用户的历史文件:root 与服务账号另有独立文件,漏查会缺失提权后的关键命令
  • 把历史当完整记录:HISTSIZE 截断与手工清理都会造成缺失,必须有其它日志互证
  • 报告里原样引用命令:可能连带泄露凭据或内部地址,必须脱敏

数据来源与参考

  • zsh 官方文档(HISTFILE/SHARE_HISTORY)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌