history 是 Bash 內建命令,記錄當前會話執行過的命令序列,支援搜尋、重執行、刪除、匯出等操作。配合環境變數 HISTTIMEFORMAT、HISTSIZE、HISTCONTROL 可構建完整的命令審計與效率增強體系。本文系統講解 history 核心功能、進階技巧、配置最佳實踐與安全審計應用。
| 操作 | 命令/按鍵 | 說明 |
|---|---|---|
| 顯示歷史列表 | history / history 20 (最近 20 條) | 編號 + 命令 |
| 顯示時間戳 | HISTTIMEFORMAT='%F %T ' history | 需先設定環境變數 |
| 反向搜尋 | Ctrl+R 輸入關鍵字 | 即時匹配歷史,Enter 執行,Esc 編輯 |
| 正向搜尋 | Ctrl+S (需 stty -ixon 解鎖) | |
| 重執行上一條 | !! / !-1 / Ctrl+P / 上方向鍵 | 四種等效方式 |
| 重執行第 N 條 | !N | !42 |
| 重執行最近以字串開頭的命令 | !字串 | !git 執行最近 git 開頭命令 |
| 重執行包含字串的命令 | !?字串? | !?deploy? |
| 刪除指定歷史 | history -d N | history -d 42 |
| 清空當前會話歷史 | history -c | 不影響歷史檔案 |
| 寫入歷史檔案 | history -w | 將會話歷史追加到 HISTFILE |
| 讀取歷史檔案 | history -r | 追加檔案內容到會話 |
編輯 ~/.bashrc 或 /etc/profile.d/history.sh (系統級):
# === 歷史記錄容量 ===
export HISTSIZE=10000 # 記憶體中保留條數
export HISTFILESIZE=20000 # 歷史檔案最大條數
# === 歷史檔案位置 ===
export HISTFILE=~/.bash_history # 預設,可自訂如 ~/.history/bash_$(date +%Y%m)
# === 時間戳格式 (關鍵:審計必備) ===
export HISTTIMEFORMAT='%F %T %z ' # 2024-03-18 14:30:00 +0800
# === 去重與過濾 ===
export HISTCONTROL=ignoreboth:erasedups
# ignoreboth = ignorespace (空格開頭不記錄) + ignoredups (連續重複不記錄)
# erasedups = 刪除歷史中所有重複項 (僅保留最新)
# === 忽略特定命令 ===
export HISTIGNORE="ls:ll:cd:pwd:exit:history*:bg:fg:clear"
# === 即時同步 (多終端共享歷史) ===
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
# -a 追加新命令到檔案
# -c 清空會話緩衝
# -r 重讀檔案合併到會話
# 效果:打開新終端即可見其他終端剛執行的命令
# 匯出含時間戳的完整歷史
history -w # 確保寫入檔案
cat ~/.bash_history | while IFS= read -r line; do
# 解析 HISTTIMEFORMAT 格式 (若檔案含時間戳)
echo "$line"
done > history_audit_$(date +%Y%m%d).txt
# 統計高頻命令 TOP 20
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -20
!! # 上一條完整命令
!!:0 # 上一條命令名 (第 0 個詞)
!!:^ # 上一條第一個參數 (第 1 個詞)
!!:$ # 上一條最後一個參數
!!:* # 上一條所有參數 (第 1 詞到最後)
!!:2 # 上一條第 2 個詞
!!:2-4 # 第 2 到第 4 詞
!!:- # 第 1 詞到倒數第 2 詞
^old^new^ # 替換上一條命令中首個 old 為 new (快速修正拼寫)
!!:s/old/new/ # 同上,標準修飾符語法
!!:gs/old/new/ # 全域替換上一條命令中所有 old
# 僅當上一條命令成功才執行後續
!! && echo "Previous succeeded"
# 僅當上一條命令失敗
!! || echo "Previous failed"
# 加入 crontab 每月執行
# 0 3 1 * * /usr/local/bin/rotate_history.sh
#!/bin/bash
# rotate_history.sh
HIST=~/.bash_history
BAK=~/.bash_history.$(date +%Y%m)
mv "$HIST" "$BAK"
gzip "$BAK"
# 可選:只保留最近 10000 行
tail -10000 "$BAK" > "$HIST"
| 場景 | 配置/操作 | 價值 |
|---|---|---|
| 合規審計 (等保/ISO27001) | 系統級 HISTTIMEFORMAT + PROMPT_COMMAND 即時同步 + 集中日誌收集 (rsyslog/Elastic) | 所有管理員操作可追溯、可查證、不可抵賴 |
| 異常操作排查 | history | grep -E \"rm|dd|mkfs|chmod|chown|passwd|userdel\" | 快速定位高危操作 |
| 帳號共用責任劃分 | 強制個人帳號登入,sudo 記錄原始使用者 + history 記錄具體命令 | 責任到人 |
| 防範歷史清除竄改 | chattr +a ~/.bash_history (僅追加)、遠端同步備份、HISTCONTROL 不含 ignorespace | 防惡意 history -c / > ~/.bash_history |
| 問題 | 原因/解決 |
|---|---|
| 時間戳顯示為設定時間而非執行時間 | HISTTIMEFORMAT 只對設定後的新命令生效,歷史命令無法補齊 |
| 多終端歷史不同步 | 未設定 PROMPT_COMMAND 即時同步,或 Shell 版本不支援 |
Ctrl+R 無法使用 | 終端未啟用 Readline (如極簡 Shell),或 stty 衝突 |
| 歷史檔案權限洩漏敏感資訊 | chmod 600 ~/.bash_history,避免密碼/Token 明文寫入歷史 (改用環境變數/密碼管理器) |
將 history 從「查看記錄」升級為「操作審計、效率加速、合規支撐」的核心基礎設施,是資深 Linux 使用者與運維團隊的必修課。
Linux 使用 du 與 df 指令尋找並清理大型檔案釋放磁碟空間
Kali Linux 安裝後必做配置指南:軟體源、中文輸入法、Flash、QQ、開發工具一鍵部署
Linux 雙伺服器 IP 無縫切換實戰:ifconfig 別名介面 + arping 免費 ARP 宣告秒級遷移
Linux SecureCRT 中文亂碼終極解決:三步配置法
RHEL 5 使用 Autofs 自動掛載 /dev/sdb 至 /data/abc:配置 auto.master 與 auto.mytest 實現按需掛載
Ubuntu 軟體中心完整使用指南:搜尋、安裝、移除應用程式