TL;DR
在轉移到macOS後,我沒有找到像WinSSHTerm那樣方便地滿足我日常使用場景的SSH客戶端。
厭倦了不斷的妥協,制定了需求,組裝了自己的客戶端,並將程式碼開源。
背景
如果你同時管理多台伺服器,幾乎任何SSH客戶端「某種程度上」都能勝任。
如果你每天要處理數十甚至數百台主機,那麼重要的不再是幻燈片上的功能,而是速度與可預測性:
多快能找到所需的主機;
連線前需要多少步驟;
管理環境結構的方便程度;
應用程式在活躍使用一個月後的表現如何。
在 Windows 上,WinSSHTerm 在這方面長久以來一直幫了我大忙。
轉換到 macOS 後,我原本預期能在一晚內找到替代品,但沒成功。
現有解決方案中哪些不滿意
我沒有尋找「理想」。我在尋找一個不妨礙工作的工具。
問題在客戶之間重複出現:
到達會話的路徑太長
主要場景應該很快,但常常淹沒在多餘的點擊中。大量主機的組織性薄弱
當你有很多環境和專案時,沒有正常的群組、標籤和搜尋,一切都會變成混亂。過載的介面
美觀的面板和「豐富的UI」常常損害了應用程式被打開的目的:連線和工作。不便的設定可攜性
希望有透明的配置,易於儲存、搬遷和版本控制。
經過幾週的測試,我發現自己花在對付工具上的時間比解決問題還多。
為什麼決定自己寫
原因不是「周圍的一切都做得很差」。
我坐下來明確列出我認為必須滿足的條件:
啟動和連接盡可能快;
按名稱/IP/標籤搜尋;
按環境和項目的群組結構;
常用操作的快捷鍵;
可預測的配置存儲;
最少的視覺噪音;
在主機列表很大時穩定的行為。
此後便明白:與其無止盡地遷就別人的妥協,不如自己打造一套工具。
客戶端架構所依據的原則
1) 本地優先
主要操作應快速且不依賴網路。
主機與連線資料存放在本地,UI 不需等待「外部服務」即可開啟清單。
2) 更快連線
任何功能都通過一個問題來評估:它是否加速了通往活躍工作階段的路径?
如果不是——就放入待辦清單。
3) 可預測性比「魔法」更重要
寧可少一些「自動智能化」,但要有清晰且可控的邏輯。
4) 配置即資產
配置應該滿足:
人類可讀;
可供備份;
可跨機器攜帶;
適合 Git 使用。
架構(高層級)
我將應用程式劃分為數個獨立層級:
UI Layer(UI 層)
主機列表、搜尋、篩選、連線卡片、快速操作。Session Layer(連線層)
SSH 連線的生命週期:啟動、重新連線、結束、狀態。配置層
配置(主機、群組、標籤、預設)的讀取/驗證/遷移。儲存層
用於服務資料的本地儲存(例如,最近/最愛/歷史)。整合層
與系統SSH和macOS環境的互動。
這使得UI邏輯與連接不會混在一起,並且在更改設定格式時不會破壞一切。
真正有幫助的資料模型
起初嘗試了簡化的「主機清單(список хостов)」模型。
很快就清楚了:隨著基礎設施的增長,需要一個正常的結構。
基本實體:
主機(Host)
名稱,地址,端口,用戶,auth參數,元數據。群組
邏輯分組(例如, 生產, 暫存, 客戶端/*)標籤
橫向截面 (k8s, 資料庫 (db), 關鍵的, 遺產)。個人資料
可重複使用的連接參數。SessionPreset
會話行為的預先設定。
正是組合 group + tags + search 在實踐中帶來了最大的速度提升。
產生最大效果的UX設計方案
預設聚焦於搜尋
打開客戶端,即可立即列印與篩選。鍵盤快速操作
鍵盤與滑鼠之間切換越少,工作週期越快。最近與收藏的主機
頻繁的連線應一步完成。最少彈出視窗
彈出視窗會拖慢流程。我只在必要時使用它們。穩定的資訊層次結構
相同類型的資訊總是在同一個地方。
安全與運行
我單獨列出了那些經常被推遲的「以後再做」的基礎事項:
不要將私鑰存儲在應用程式內部;
使用SSH系統機制;
明確顯示正在連接到哪個主機/環境;
避免危險的預設值;
僅記錄診斷所需的內容,不洩漏敏感資料。
這並不能讓客戶端「絕對安全」(這種情況不存在),但消除了「方便但有風險」這類典型錯誤。
最困難的是什麼
放棄多餘的功能
添加按鈕容易,移除多餘的困難。保持簡單與靈活性的平衡
做到「既簡單又強大」而不必大雜燴——這是迭代的結果,而非一次設計。將小細節優化到便利
最「看不見」的東西(焦點、標籤頁順序、鍵盤情境)比大型功能解決更多問題。
最終得到了什麼
主要變化不在於「又出現了一個SSH客戶端」。
主要是——日常摩擦消失了:
更快找到所需節點;
切換環境時更少出錯;
不花費注意力在介面上;
在遷移/備份時不必與配置文件鬥爭。
簡而言之:該工具不再是問題的一部分,而是再次成為解決方案的一部分。
路線圖
項目的下一步:
改進批量操作以處理大型主機群。
擴展配置的導入/導出功能。
更靈活的篩選器和保存的視圖。
打磨長時間運行場景(每天工作數小時)的用戶體驗。
預設設定中的額外安全檢查。
對於處於類似情況的人
如果你也對 macOS 的現成解決方案不滿意,我建議不要從程式碼開始,而是從日常痛點的檢查清單開始。
當需求被誠實地提出時,就會清楚:是繼續尋找還是自己編寫。
在我的情況下,答案是後者。












