開發者

Mac 上的 SSH 和 Git 逾時

SSH 和 Git 需要與伺服器之間有正常的 TCP 連線。封鎖連接埠 22 的網路、故障的 IPv6 路徑或代理伺服器,都可能讓它們連不上。

適用於:所有目前的 macOS 版本,搭配 macOS 或 Homebrew 安裝的 OpenSSH 和 Git。檢查日期:2026年10月29日

症狀

  • 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 或代理伺服器環境變數。

如何檢查

  1. 以詳細輸出模式連線。最後幾行會顯示連線停在哪裡。

    ssh -vT git@github.com
  2. 單獨測試 TCP 連接埠,逾時設為 5 秒。

    nc -vz -G 5 github.com 22
  3. 只試 IPv4。如果這樣可以連線,問題就出在 IPv6 路徑。

    ssh -4 -T git@github.com
  4. 測試 GitHub 在連接埠 443 上的 SSH 服務。

    ssh -T -p 443 git@ssh.github.com
  5. 顯示 Git 的代理伺服器設定和你的代理伺服器環境變數。

    git config --get http.proxy
    env | grep -i proxy

如何修正

  1. 如果連接埠 22 被封鎖,對 GitHub 改用經由連接埠 443 的 SSH。將這個區塊加入 ~/.ssh/config。

    Host github.com
        Hostname ssh.github.com
        Port 443
        User git
  2. 如果 IPv6 失敗,對該主機改用 IPv4。在 ~/.ssh/config 中該主機的區塊加入 AddressFamily inet。

  3. 若要讓閒置的工作階段保持開啟,每 60 秒傳送一次訊息。在主機區塊中加入 ServerAliveInterval 60。

  4. 若要避免長時間等待,在主機區塊中加入 ConnectTimeout 10。

  5. 如果 HTTPS 遠端位於代理伺服器後方,請設定 Git 的代理伺服器。

    git config --global http.proxy http://proxy.example.com:8080
  6. 作為測試,改用儲存庫的 HTTPS URL,而不是 SSH URL。

使用 Kilobat

  1. Kilobat 的連線檢查會分別測試 IPv4 和 IPv6,所以 IPv6 路徑故障時也能得到明確的答案。

    kilobat why github.com
  2. 查看單一處理程序開啟中的連線。

    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> 開啟。