| 參數 | 作用 | 典型場景 |
-t | 將時間數據輸出到 stderr(需重定向到文件) | 回放必需,記錄每個命令的時間間隔 |
-f | 刷新輸出(實時寫入文件) | 多終端實時同步演示、審計實時落盤 |
-a | 追加模式(不覆蓋現有文件) | 長期審計、多次會話合併記錄 |
-q | 靜默模式(不提示 "Script started/ended") | 隱蔽審計、自動化腳本 |
基礎用法
1. 錄製會話
# 開始錄製,時間存 demo.time,內容存 demo.his
script -t 2>demo.time -a demo.his
# 正常操作終端...
# 結束:Ctrl+D 或輸入 exit
2. 回放會話
scriptreplay demo.time demo.his
# 必須:時間文件在前,內容文件在後
進階場景實戰
場景一:多終端實時同步教學/演示
# 講師終端(錄製並實時刷新)
script -f demo.session
# 學生終端(實時回放)
scriptreplay -f demo.session
# 效果:講師敲鍵盤、輸出結果,學生終端毫秒級同步顯示
場景二:跳板機/堡垒機安全審計(用戶登錄自動錄製)
編輯用戶 ~/.bash_profile 或 ~/.bashrc,在末尾添加:
# 自動錄製,文件名含用戶名、UID、時間戳,靜默、追加、實時刷新
script -t -f -q 2>/var/log/script/$USER-$UID-$(date +%Y%m%d%H%M%S).time \
-a /var/log/script/$USER-$UID-$(date +%Y%m%d%H%M%S).his
# 解決 Ctrl+D 雙重退出問題(SHLVL=1 為登錄 Shell)
if [ "$SHLVL" = 1 ]; then exit; fi
效果:用戶 SSH 登錄瞬間開始錄製,退出自動結束,日志集中存放於 /var/log/script/,不可篡改(需配置目錄權限)。
場景三:遠程協助/外包人員操作留痕
# 在授權 SSH 會話中手動啟動
/usr/bin/script -qa /var/log/audit/remote_$(date +%s).log
# -q 靜默,-a 追加,對方無感知
回放技巧與常見問題
- 加速回放:
scriptreplay -d 0.5 demo.time demo.his(0.5 倍速,數值越小越快)。
- 只看命令不看輸出:
grep -v "^$" demo.his | grep -E "^[^ ]" 簡易過濾,或解析 timing 文件提取命令行。
- 亂碼/顏色控制字符:錄製時終端輸出 ANSI 色碼,回放時若終端不支持會顯示亂碼。建議錄製前
export TERM=dumb 或回放時用 cat -v 查看原始碼。
- 大文件性能:長時間會話生成 GB 級日志,回放緩慢。可定期
split 切分或用 asciinema(更現代、支持 Web 回放)。
替代方案對比
| 工具 | 優點 | 缺點 | 適用場景 |
| script/scriptreplay | 系統自帶、無依賴、標準格式 | 無壓縮、回放不可暫停/跳轉、色碼問題 | 審計、簡單教學、腳本化 |
| asciinema | Web 回放、可暫停/跳轉、壓縮、可嵌入網頁 | 需安裝 Python、依賴網絡上傳(可本地) | 技術分享、文檔、CI/CD 展示 |
| ttyrec/ttyplay | 輕量、C 語言、支持壓縮 | 需編譯安裝、格式非標準 | 嵌入式、極簡環境 |
| sudosh | 專為 sudo 審計設計、集中日志 | 維護較少、配置複雜 | 企業級特權審計 |
最佳實踐清單
- ✅ 審計場景強制使用
-t -f -q -a 組合:時間戳、實時落盤、靜默、追加。
- ✅ 日志目錄設置
chattr +a(僅追加屬性)防止刪除篡改。
- ✅ 定期備份日志到異地存儲(WORM 存儲更佳)。
- ✅ 教學演示優先用
asciinema,體驗更好、易分享。
- ❌ 避免在高並發生產服務器長期開啟
-f,磁盤 IO 可能成為瓶頸。
- 上一篇文章: XMLBeans 入門教程(一):從 XML Schema 生成 Java 類、編譯 JAR 與項目集成
- 下一篇文章: Tomcat + Java Web 應用 CPU 100% 故障排查實戰:top → ps → jstack 定位死循環代碼
Copyright ©
程式碼之家 All Rights Reserved