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避免多窗口互相覆盖