~/.bash_history 跟 ~/.zsh_history 是 Unix 工具鏈裡少數三十年沒進步過的東西。同時開兩個終端,後關的那個會覆蓋掉先關的歷史;不記時間、不記工作目錄、不記退出碼;搜尋只能靠 Ctrl+R 一條條往回翻,跨機器同步基本上是天方夜譚。多數人選擇加上 HISTSIZE=100000、shopt -s histappend 然後假裝問題解決了。
Atuin 從這個前提重寫了整個流程。本地用 SQLite 儲存,每筆紀錄帶上 cwd、執行時間、耗時、退出碼、session ID 和主機名;搜尋是 fuzzy match 加上多欄位過濾;同步是選擇性開啟的端對端加密,伺服器可以自架。整個工具用 Rust 寫,單一 binary,跨 bash、zsh、fish、nushell、xonsh、PowerShell。
預設 shell history 到底缺什麼
舉個情境:上週在某台伺服器上跑了一條長到不像話的 ffmpeg 指令解 codec 問題,這週另一台機器又碰到,但記不得參數。打開 .bash_history,看到的只是一行純文字,沒有時間、沒有目錄、沒有結果。如果中間還曾把 shell 卡死強制重開,這行甚至可能根本沒寫進檔案。
Atuin 改成事件式記錄,每條指令在開始執行時就先寫進 SQLite,執行完成後再回頭補上耗時和退出碼。資料結構大致是:
1 | id, timestamp, duration, exit, command, |
這意味著可以下這種查詢:「上個月在 prod1 主機的 /etc/nginx/ 底下執行過、退出碼非 0 的指令」。Atuin CLI 直接提供 atuin search --cwd /etc/nginx --exit 1 --before "1 month ago" 這種組合條件。
對團隊更實際的價值在於失敗指令的可追溯性。退出碼存下來之後,事後追查「那次部署到底哪一步噴錯」不必再翻 tmux 的卷軸緩衝區。
E2E 加密同步:伺服器看不到明文
Atuin 的同步協定值得單獨講。每個帳號註冊時會在客戶端生成一組對稱金鑰,這把金鑰用密碼派生的另一把金鑰加密後,存在本地的 ~/.local/share/atuin/key。所有要上傳的歷史紀錄都先以這把金鑰做 XChaCha20-Poly1305 加密,伺服器拿到的只是密文跟一個用來去重的 hash。
換句話說,自架伺服器看到的歷史紀錄全是亂碼,連伺服器管理員(也就是使用者本人)都無法從資料庫倒推內容——除非同一把金鑰還在某台機器上。這對含有密碼、token、API key 的指令歷史是必要的設計,畢竟很多人會把 secret 直接打在 command line 上。
副作用是換機器時需要做 atuin key 把現有金鑰印出來,到新機器跑 atuin login 時貼進去。忘記備份金鑰等於整份雲端歷史變垃圾資料,這點在第一次設定時就要警覺。
自架 sync 伺服器:PostgreSQL 加一支 binary
官方雲端服務免費,但要有完整控制權還是建議自架。Atuin server 需要 PostgreSQL 14 以上,本身就是一支 Rust binary 加一個薄薄的 HTTP API。
1 | services: |
兩個細節容易踩到。第一,ATUIN_OPEN_REGISTRATION 預設是 true,意思是任何人知道網址就能註冊帳號開始用你的 PostgreSQL。除非有意對外開放,否則第一件事就是改成 false,註冊完自己的帳號再關掉。
第二,伺服器不終結 TLS,前面一定要放反向代理。Caddy 或 Nginx 都行,把 8888 綁在 loopback、上層接 HTTPS 才是安全配置。直接把 8888 暴露在公網是常見錯誤。
客戶端設定走 ~/.config/atuin/config.toml:
1 | sync_address = "https://atuin.example.com" |
註冊跟登入:
1 | atuin register -u user -e [email protected] |
v18.13 加進來的搜尋功能
2026 年的 v18.13 是把搜尋體驗推上另一個層級的版本。最值得提的兩點:
自訂鍵位:TUI 模式的鍵位過去是寫死的,這次終於允許在 config 裡完全自訂。對習慣 Vim 風格綁定的使用者來說是大解放。
Smart sort 改善:搜尋結果的排序權重重新調校,加上「在同樣的 cwd 用過幾次」的因素。也就是說在 /var/log 底下搜 grep 時,跟在 ~/project 底下搜 grep 會看到完全不同的順序,命中率比之前高出一截。
更值得期待的是 PTY proxy 功能進入 beta。Atuin 開始能直接記錄整個 PTY session 的輸出,而不只是指令本身,未來會成為 Atuin Desktop 的可執行 runbook 基礎建設。
Atuin Desktop 與 runbook:方向轉變的訊號
2026 年 Atuin 把 Desktop 應用程式開源化,並推出重新設計的 runbook 執行引擎。Runbook 在這裡指的是一份可執行的文件——把指令、變數、輸出全部嵌進 Markdown,可以一格一格執行,狀態跨重啟保留。
這條產品線目前比較適合運維場景:用來把「機器壞掉時要跑的處置流程」寫成可重複執行的文件。Workspace 可以選擇雲端同步或純本地由 Git 管理,後者對需要納入版本控制的 SRE 團隊比較合適。
對只想要好用 shell history 的使用者來說,Desktop 是錦上添花,不必非裝不可。CLI 本身已經足夠完整。
適合自架的場景與不適合的情況
自架 Atuin 的甜蜜點是個人或小團隊在管理數台到數十台 VPS。每天在多台機器之間切換,歷史紀錄分散是真實痛點,自架可以把這份資料完全留在自己掌控的伺服器上。
不太適合的情況有兩種。一是純粹只用一台機器,那 SQLite 本地版就夠了,連帳號都不必註冊。二是組織有嚴格的合規限制要求每條指令必須有稽核軌跡——Atuin 不是為了稽核設計的,使用者隨時可以刪除自己的歷史紀錄,這是個人工具的定位,不是 SIEM。
備份策略上,PostgreSQL 那邊用 pg_dump 加異地儲存即可。但更關鍵的是金鑰備份:每個用戶端的 ~/.local/share/atuin/key 應該離線存一份,密碼管理器或實體紙本都行。伺服器資料庫掛了可以從 dump 還原,金鑰沒了就真的沒了。
shell history 看起來小,每天用 shell 工作的人卻會被它的爛設計拖累一輩子。把 Atuin 跟自架同步服務搭起來,等於把過去散落在各台機器、各個檔案的指令歷史,整合成一份可搜尋、可分析、加密留存的個人知識庫。
NCSE Network 的 VPS 採 Intel Gold CPU 與 NVMe SSD,位於臺灣是方電訊機房,跑 Atuin server 加 PostgreSQL 的資源需求極低,最小規格方案就綽綽有餘,延遲低、頻寬穩,適合作為個人開發工具鏈的長期落腳處。詳情可到 ncse.tw 查看方案。