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#
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áyTê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:
#!/bin/bash
case "$1" in
Username*) echo bot ;;
*) cat /đường/dẫn/token ;;
esacGIT_ASKPASS=./askpass.sh GIT_TERMINAL_PROMPT=0 git clone https://git.example.com/bot/repo.gitGIT_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.
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ờ.