R / Richie全部文章 ↑

Linux · 2 分钟阅读

history 配置

2026 年视角:生产机器的 shell history 既是便利也是审计源。建议所有用户用同样的格式(时间戳 + 用户),否则事后回溯就是瞎子摸象。

配置文件层级

范围 文件
用户级 ~/.bashrc、~/.bash_profile
系统级 /etc/profile、/etc/bashrc、/etc/profile.d/*.sh

核心变量

# 时间格式(写 history 前先 export)
export HISTTIMEFORMAT="%F %T  "

# 内存中保留多少条
export HISTSIZE=10000

# 文件保留多少条
export HISTFILESIZE=20000

# 立即追加而非覆盖
shopt -s histappend

# 实时落盘(多人共享 session 必备)
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

HISTCONTROL 选项

值 行为
ignoredups 忽略连续重复
ignorespace 忽略以空格开头的命令
ignoreboth 上面两种都要
erasedups 删掉之前出现过的相同命令(全局去重)
export HISTCONTROL=ignoreboth

写密码的临时命令前加一个空格,配合 ignorespace 自动不记录。

按用户归档(审计场景)

/etc/profile.d/history.sh:

HISTDIR=/var/log/bash-history
[ ! -d "$HISTDIR/$USER" ] && mkdir -p "$HISTDIR/$USER" && chmod 300 "$HISTDIR/$USER"

USER_IP=$(who -u am i 2>/dev/null | awk '{print $NF}' | tr -d '()')
USER_IP=${USER_IP:-$(hostname)}

export HISTFILE="$HISTDIR/$USER/${USER_IP}.$(date +%Y%m%d-%H%M%S)_$$"
export HISTTIMEFORMAT="%F %T "
export PROMPT_COMMAND="history -a; history -w"
chmod 600 "$HISTDIR/$USER/$HISTFILE" 2>/dev/null

几条铁律

  • 服务器上每个人的 history 目录应 chmod 700,防止别人看见
  • PROMPT_COMMAND="history -a" 是必须的,否则意外退出时丢失命令
  • HISTIGNORE 可指定完全忽略的命令列表,比如 ls、exit
  • 用 shopt -s histappend 避免多窗口互相覆盖

参考