每次 SSH 登入都要輸入密碼/驗證碼很繁瑣?SSH 連線多路複用 讓首次建立連線後,同目標主機的後續連線共享既有 TCP 連線與認證狀態,實現「一次認證,多次免密」。本文詳細解析設定方法、原理與注意事項。
~/.ssh/config)Host *
ControlMaster auto
ControlPath /tmp/ssh-%r@%h:%p
ControlPersist 30m # 選擇性:主連線關閉後保持 socket 30 分鐘
| 參數 | 說明 |
|---|---|
ControlMaster auto | 自動偵測:若無既有主連線則建立,否則共用現有 socket |
ControlPath | Unix Domain Socket 路徑模板:%r=遠端用戶、%h=遠端主機、%p=埠號、%l=本地主機建議至少含 %h%p%r 確保唯一性 |
ControlPersist | 主連線離開後 socket 保留時間(預設 0 即隨主連線關閉),避免頻繁重連 |
ssh user@host:建立 TCP 連線、完成認證、在 ControlPath 建立 Unix Socket 檔案ssh user@host、scp、rsync、git push 等:偵測到同樣 %r@%h:%p 的 socket,直接透過 Unix Socket 轉發協定,完全繞過 TCP 三向交握與認證ssh -v user@host 2>&1 | grep -i "control\|master\|socket"
# 輸出含 "Master connection"、"auto-mux" 等字樣即成功
| 優點 | 缺點/風險 |
|---|---|
| 大幅縮短二次連線延遲(毫秒級) | 主連線中斷(Ctrl+C、網路斷)會導致所有共用連線強制斷開 |
| 減少 SSH 守護程序併發連線數 | 不適用於需獨立認證/權限的場景(如 sudo 要求 tty) |
| 配合 ControlPersist 適合腳本批次操作 | /tmp 目錄權限需注意(建議改用 ~/.ssh/controlmasters/) |
對於靜態金鑰認證,直接用 ssh-copy-id 部署公鑰最簡單。但動態密碼(OTP)、跳板機、VPN 後認證 等場景,公鑰無法使用,ControlMaster 成為「輸入一次 OTP,後續腳本全免驗證」的關鍵解法。
ssh-agent + 金鑰轉遞:適用金鑰認證,需 ForwardAgent yestmux/screen:會話層面持久化,非連線層面共享善用 ControlMaster,讓 SSH 操作如同本地終端般流暢,是系統管理員與開發者的效率倍增器。