script 命令能將整個終端會話(輸入命令、輸出結果、時間戳)錄製為文件,是實現運維操作審計、合規留痕、故障複盤的利器。本文介紹通過 /etc/profile 全局部署 script,自動記錄所有非系統用戶(UID≥1000)的登錄操作。
編輯 /etc/profile 末尾添加:
# 為每個登錄用戶創建獨立日志目錄
LOG_DIR="/var/log/user_scripts"
mkdir -p "$LOG_DIR"
chmod 750 "$LOG_DIR"
chown root:adm "$LOG_DIR"
# 僅對普通用戶(UID>=1000)啟用,排除系統賬號
if [ "$UID" -ge 1000 ] && [ -z "$SCRIPT_SESSION" ]; then
export SCRIPT_SESSION=1
TIMESTAMP=$(date +%Y%m%d%H%M%S)
LOG_FILE="${LOG_DIR}/${USER}-${UID}-${TIMESTAMP}.log"
TIMING_FILE="${LOG_DIR}/${USER}-${UID}-${TIMESTAMP}.timing"
# -t 輸出時間戳到 stderr,重定向到 timing 文件
# -f 刷新輸出(實時寫入)
# -q 靜默模式
# -a 追加模式(防多次登錄覆蓋)
exec /usr/bin/script -t 2>"$TIMING_FILE" -f -q -a "$LOG_FILE"
fi
| 參數 | 作用 | |
|---|---|---|
-t | 將時間戳(每次輸出間隔)輸出到 stderr,配合 2>timing_file 記錄,供 scriptreplay 回放 | |
-f | 每次輸出後 flush,確保實時寫入,防崩潰丟失 | |
-q | 靜默啟動,不提示 "Script started/ended" | |
-a | 追加模式,避免同用戶多次登錄覆蓋舊日志 | |
exec | 替換當前 Shell 進程,使 script 成為登錄 Shell,退出 script 即登出 |
| 風險 | 說明 | 緩解措施 |
|---|---|---|
用戶手動 exit 退出 script | exec 替換 Shell,exit 即登出,無法繞過 | 正確配置 exec,無法在 script 內再次 exec |
用戶使用 ssh -t 強制分配 TTY 繞過 | script 依賴 TTY,正常 SSH 即分配 TTY | 配置正確,無繞過空間 |
用戶修改 /etc/profile | 需 root 權限 | 嚴格控制 root/sudo 權限 |
| 性能開銷 | 高頻 I/O 寫入磁盤 | 日志目錄掛載高性能存儲、開啟 logrotate 壓縮 |
script 部署簡單、零依賴、原生支持,是中小團隊快速落地操作審計的首選方案。大規模環境建議上堡壘機平台,實現全生命週期審計閉環。