| name | oc-ssh-fix |
| description | Use when the user has SSH connection issues, or says 'SSH 連不上', 'connection failed', '連線失敗', 'ssh fix', 'SSH 修復', 'SSH 斷了', 'can't connect'. |
oc-ssh-fix
Runtime Configuration
執行前讀取 setup.json:
- SSH alias 用
remote.sshAlias(以下以 ${SSH_ALIAS} 表示)
- Fallback alias 用
remote.sshAliasFallback(以下以 ${SSH_ALIAS_FALLBACK} 表示)
- 遠端 IP 用
remote.host(以下以 ${HOST} 表示)
- Fallback IP 用
remote.hostFallback(以下以 ${HOST_FALLBACK} 表示)
- 遠端使用者用
remote.user(以下以 ${REMOTE_USER} 表示)
步驟
1. 測試現有連線
按優先順序嘗試:
ssh -o ConnectTimeout=5 ${SSH_ALIAS} 'echo ok' 2>&1
成功 → 回報「連線正常」並結束。
ssh -o ConnectTimeout=5 ${SSH_ALIAS_FALLBACK} 'echo ok' 2>&1
成功 → 回報「主要連線失敗,但 fallback 可用」,建議該 session 使用 fallback。
ssh -o ConnectTimeout=5 ${REMOTE_USER}@${HOST} 'echo ok' 2>&1
成功 → 回報「SSH alias 設定可能有問題」,進入步驟 3 檢查 SSH config。
2. 所有連線都失敗 — 排查
2.1 網路可達性
ping -c 3 ${HOST}
如果有 fallback IP:
ping -c 3 ${HOST_FALLBACK}
- 兩個都 ping 不到 → 遠端主機可能關機或不在同一網路
- 只有主要 IP ping 不到 → 可能是 Tailscale 問題
2.2 Tailscale 檢查(如果 setup.json 記錄有 Tailscale)
tailscale status
沒跑 → 嘗試啟動:
tailscale up
啟動後重試主要連線。
2.3 SSH 服務檢查
如果 ping 得到但 SSH 連不上:
- 回報:遠端主機可到達但 SSH 連線被拒
- 可能原因:SSH 服務未啟動、防火牆封鎖 port 22
- 建議:使用者需要在遠端主機上手動檢查
3. SSH Config 檢查
讀取本機 ~/.ssh/config,確認:
- 有
Host ${SSH_ALIAS} 區塊
HostName 是否正確(對應 setup.json 的 remote.host)
User 是否正確(對應 setup.json 的 remote.user)
ConnectTimeout 是否設定
如果有問題 → 提供修正後的 config 區塊,詢問使用者是否要修復。
4. SSH Key 檢查
ls -la ~/.ssh/id_*.pub
- 沒有 key → 建議重新產生(
ssh-keygen -t ed25519)
- 有 key → 嘗試手動 SSH 指定 key:
ssh -o ConnectTimeout=5 -i ~/.ssh/id_ed25519 ${REMOTE_USER}@${HOST} 'echo ok'
如果密碼驗證可以但 key 不行 → 需要重新 ssh-copy-id。
5. 修復摘要
回報找到的問題和已執行/建議的修復,格式:
## SSH 連線診斷
| 檢查項目 | 結果 |
|----------|------|
| 主要連線 (${SSH_ALIAS}) | ✅ / ❌ |
| Fallback 連線 | ✅ / ❌ / N/A |
| 直接 IP 連線 | ✅ / ❌ |
| Ping | ✅ / ❌ |
| Tailscale | ✅ / ❌ / N/A |
| SSH Config | ✅ / ❌ |
| SSH Key | ✅ / ❌ |
建議動作:...