開發者
Mac 上的 SSH 和 Git 逾時
SSH 和 Git 需要與伺服器之間有正常的 TCP 連線。封鎖連接埠 22 的網路、故障的 IPv6 路徑或代理伺服器,都可能讓它們連不上。
症狀
git push或git clone一直等待,然後顯示「Operation timed out」。ssh在某個網路上顯示「Connection timed out」,換到另一個網路卻正常。- SSH 工作階段閒置幾分鐘後就凍結。
- HTTPS 的 Git 遠端可以用,SSH 遠端卻不行。
可能原因
- 連接埠 22 被封鎖。有些公司、飯店和公共網路會封鎖 SSH。GitHub 表示,防火牆有時會拒絕 SSH 連線。
- IPv6 路徑故障。Mac 會先嘗試 IPv6。如果 IPv6 無法運作,連線就會一直等待。
- 閒置連線被關閉。路由器或防火牆可能會中斷一段時間沒有傳送資料的連線。
- 需要代理伺服器。在公司網路上,HTTPS 的 Git 可能需要
http.proxy或代理伺服器環境變數。
如何檢查
以詳細輸出模式連線。最後幾行會顯示連線停在哪裡。
ssh -vT git@github.com單獨測試 TCP 連接埠,逾時設為 5 秒。
nc -vz -G 5 github.com 22只試 IPv4。如果這樣可以連線,問題就出在 IPv6 路徑。
ssh -4 -T git@github.com測試 GitHub 在連接埠 443 上的 SSH 服務。
ssh -T -p 443 git@ssh.github.com顯示 Git 的代理伺服器設定和你的代理伺服器環境變數。
git config --get http.proxy env | grep -i proxy
如何修正
如果連接埠 22 被封鎖,對 GitHub 改用經由連接埠 443 的 SSH。將這個區塊加入
~/.ssh/config。Host github.com Hostname ssh.github.com Port 443 User git如果 IPv6 失敗,對該主機改用 IPv4。在
~/.ssh/config中該主機的區塊加入AddressFamily inet。若要讓閒置的工作階段保持開啟,每 60 秒傳送一次訊息。在主機區塊中加入
ServerAliveInterval 60。若要避免長時間等待,在主機區塊中加入
ConnectTimeout 10。如果 HTTPS 遠端位於代理伺服器後方,請設定 Git 的代理伺服器。
git config --global http.proxy http://proxy.example.com:8080作為測試,改用儲存庫的 HTTPS URL,而不是 SSH URL。
使用 Kilobat
Kilobat 的連線檢查會分別測試 IPv4 和 IPv6,所以 IPv6 路徑故障時也能得到明確的答案。
kilobat why github.com查看單一處理程序開啟中的連線。
kilobat destinations --pid 12345
常見問題
為什麼 ssh -4 可以連線,一般的 ssh 卻不行?
Mac 先嘗試了 IPv6,而 IPv6 路徑無法運作。使用 -4 時,ssh 只會使用 IPv4。
ServerAliveInterval 有什麼作用?
連線經過這麼多秒都沒有資料時,ssh 會透過連線傳送一則訊息。預設值為 0,也就是不傳送。
資料來源
- GitHub Docs:Using SSH over the HTTPS port
- ssh(1) 與 ssh_config(5),macOS 27.2 內建的 man 頁面
- nc(1),macOS 27.2 內建的 man 頁面
- git-config(1),http.proxy,macOS 27.2 內建的 man 手冊頁(Git 2.56)
資料來源檢查日期:2026年10月29日。man 頁面為 macOS 內建版本;在終端機中用 man <name> 開啟。