預設 history 只顯示指令編號與內容,缺乏時間、使用者等關鍵審計資訊。透過 /etc/profile.d/ 部署腳本,讓每筆指令自動記錄「誰、何時、在哪、執行什麼」,滿足合規與故障追溯需求。
sudo vim /etc/profile.d/history_command.sh
#!/bin/bash
# 歷史指令增強設定
# 歷史檔案位置與大小
export HISTFILE=~/.bash_history
export HISTSIZE=1200 # 記憶體中保留筆數
export HISTFILESIZE=1200 # 檔案中保留筆數
# 忽略重複指令、空白開頭指令
export HISTCONTROL=ignoredups:ignorespace
# ⭐ 關鍵:輸出格式「使用者 YYYY-MM-DD HH:MM:SS 指令」
export HISTTIMEFORMAT="$(whoami) %F %T "
# 追加模式寫入 (多終端機同步不覆蓋)
shopt -s histappend
# 唯讀保護,防止子 Shell 竄改
readonly HISTTIMEFORMAT
readonly HISTFILE
readonly HISTSIZE
readonly HISTFILESIZE
readonly HISTCONTROL
sudo chmod +x /etc/profile.d/history_command.sh
source /etc/profile.d/history_command.sh
$ history 5
1008 user1 2024-01-15 09:30:12 vim /etc/ssh/sshd_config
1009 user1 2024-01-15 09:35:47 systemctl restart sshd
1010 user1 2024-01-15 09:40:22 tail -f /var/log/auth.log
1011 user1 2024-01-15 09:45:10 history 10
1012 user1 2024-01-15 09:50:05 grep "Failed password" /var/log/auth.log
| 參數 | 格式代碼 | 範例輸出 |
|---|---|---|
| 日期 | %F | 2024-01-15 |
| 時間 | %T | 14:30:45 |
| 時間戳 (秒) | %s | 1705312245 |
| 主機名 | $(hostname) | web-server-01 |
| 終端機 | $(tty) | /dev/pts/3 |
| 工作目錄 | $(pwd) | /home/user1 |
自訂範例: export HISTTIMEFORMAT="[$(hostname)] $(whoami)@$(tty) %F %T "
syslog-ng/rsyslog 將 history 透過 PROMPT_COMMAND 即時傳送至中央日誌伺服器,防本地竄改。chattr +a ~/.bash_history 僅允許追加寫入,禁止刪除/覆寫 (需 root 解除)。auditd 監控敏感指令 (passwd, useradd, iptables, systemctl stop)。~/.zshrc,語法略異:setopt EXTENDED_HISTORY、HISTTIMEFORMAT='%F %T '。原理說明:/etc/profile.d/*.sh會在使用者互動式登入 Shell 時自動載入。HISTTIMEFORMAT非空時,Bash 會在寫入歷史檔時附加時間戳;histappend確保多終端機並行時歷史記錄不遺失;readonly防止惡意腳本修改環境變數規避審計。