---
title: "git clone treo mãi: thủ phạm là Cloudflare"
date: 2026-11-09
tags: [Công cụ]
reading_time: 1 phút
author: Cris
url: https://cris-blog.pages.dev/posts/git-clone-ssh-treo-vi-cloudflare/
---

# git clone treo mãi: thủ phạm là Cloudflare

> Domain đi qua proxy thì cổng SSH tùy biến không đi theo. Đi đường HTTPS và đừng để token lộ ra.

**TL;DR**

- Domain qua proxy Cloudflare chỉ chuyển HTTP/HTTPS.
- Cổng 2222 treo im lặng, không báo lỗi.
- GIT_ASKPASS đưa token cho git mà không nằm trong URL hay lịch sử.

`git clone ssh://git@git.example.com:2222/...` đứng yên. Không lỗi, không timeout rõ ràng, chỉ một tiến trình `ssh` treo vô tận. Mình mất gần hai phút mới nhìn ra lý do.

## Chẩn đoán trong 30 giây

```shell
getent hosts git.example.com        # ra IP của Cloudflare, không phải máy mình
ss -ltnp | grep -E ':(22|2222)\b'   # cổng 2222 không hề lắng nghe trên máy
```

Tên miền trỏ vào proxy của Cloudflare, và proxy chỉ chuyển HTTP/HTTPS. Cổng SSH tùy biến của Gitea thì không được publish, nên gói tin đi vào khoảng không.

## Đường tắt qua HTTPS, không lộ token

Không nhét token vào URL, vì URL nằm lại trong `.git/config` và lịch sử shell. Dùng `GIT_ASKPASS`, một script nhỏ trả tên và mật khẩu khi git hỏi:

```shell
#!/bin/bash
case "$1" in
  Username*) echo bot ;;
  *) cat /đường/dẫn/token ;;
esac
```

```shell
GIT_ASKPASS=./askpass.sh GIT_TERMINAL_PROMPT=0 git clone https://git.example.com/bot/repo.git
```

`GIT_TERMINAL_PROMPT=0` quan trọng: nếu thiếu thông tin, git báo lỗi ngay chứ không chờ bàn phím mãi.

> **Ghi chú:** Remote vẫn là URL HTTPS trơn. Token chỉ tồn tại trong tiến trình lúc git hỏi, không nằm trong cấu hình.

Nhớ đặt `-o ConnectTimeout` cho mọi lệnh ssh trong script. Sai một lần với timeout vô hạn là mất cả phiên chờ.

## Status

- **Đã thử:** HTTPS với GIT_ASKPASS trên Gitea tự host, clone và push đều chạy.
- **Chưa thử:** Mở SSH qua Tailscale hoặc một subdomain không qua proxy.
- **Sai ở đâu:** Giả định cổng SSH của Gitea đã được publish ra ngoài, nên chờ clone treo gần hai phút.

---

*Viết bởi Cris · cris.blog · 09/11/2026*
