diff --git a/lib/common.sh b/lib/common.sh index 14cf603..b0e05fb 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -10,6 +10,9 @@ log_error() { echo -e "${RED}[ERROR]${NC} $1" >&2; } log_step() { echo -e "${BLUE}[STEP]${NC} $1"; } log_dry() { echo -e "${YELLOW}[DRY-RUN]${NC} $1"; } +# 默认超时(秒) +: "${DEPLOY_TIMEOUT_SEC:=400}" + # ---------- Git 信息 ---------- get_git_info() { local b=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown") @@ -23,10 +26,11 @@ get_ssh_socket() { echo "/tmp/ssh-master-${REMOTE_HOST}-$$"; } ssh_connect() { [ "$DRY_RUN" = true ] && { log_dry "ssh -o ControlMaster=auto -o ControlPath=$(get_ssh_socket) ${REMOTE_USER}@${REMOTE_HOST}"; return 0; } local socket; socket=$(get_ssh_socket) - if ! ssh -o "ControlPath=${socket}" -o "ConnectionAttempts=3" -o "ConnectTimeout=10" \ + # 测试连接 + if ! timeout "${DEPLOY_TIMEOUT_SEC}" ssh -o "ControlPath=${socket}" -o "ConnectionAttempts=3" -o "ConnectTimeout=10" \ -o "ControlMaster=no" "${REMOTE_USER}@${REMOTE_HOST}" "echo ok" &>/dev/null; then log_info "建立 SSH 连接..." - ssh -o ControlMaster=auto -o ControlPath="${socket}" -o ControlPersist=600 \ + timeout "${DEPLOY_TIMEOUT_SEC}" ssh -o ControlMaster=auto -o ControlPath="${socket}" -o ControlPersist=600 \ -o ConnectionAttempts=3 -o ConnectTimeout=10 \ -N "${REMOTE_USER}@${REMOTE_HOST}" & sleep 2 @@ -41,7 +45,7 @@ ssh_disconnect() { } # SSH 快捷执行(复用 ControlMaster) -remote() { ssh -o "ControlPath=$(get_ssh_socket)" "${REMOTE_USER}@${REMOTE_HOST}" "$@"; } +remote() { timeout "${DEPLOY_TIMEOUT_SEC}" ssh -o "ConnectTimeout=10" -o "ServerAliveInterval=30" -o "ControlPath=$(get_ssh_socket)" "${REMOTE_USER}@${REMOTE_HOST}" "$@"; } # ---------- 部署日志 ---------- get_deploy_log() { echo "${REMOTE_DIR}/deploy.log"; }