diff --git a/deploy.sh b/deploy.sh index 944d9a4..ec4a601 100644 --- a/deploy.sh +++ b/deploy.sh @@ -45,6 +45,8 @@ check_ssh_connection() { ssh_exec() { # Toujours vérifier et nettoyer le socket avant chaque commande # pour éviter les sockets morts qui causent "ControlSocket already exists, disabling multiplexing" + # Le socket peut devenir invalide pendant l'exécution d'une commande précédente, + # donc on vérifie systématiquement avant chaque nouvelle commande if [ -S "${SSH_CONTROL_PATH}" ]; then if ! check_ssh_connection; then # Connexion morte, nettoyer avant d'exécuter @@ -53,15 +55,34 @@ ssh_exec() { fi # Exécuter la commande SSH (une seule tentative, pas de retry) - # ControlMaster=auto va créer une nouvelle connexion si le socket n'existe pas, - # ou réutiliser s'il est valide - ssh -o ControlMaster=auto \ + # Capture stderr pour détecter les erreurs de socket + local ssh_output + ssh_output=$(ssh -o ControlMaster=auto \ -o ControlPath="${SSH_CONTROL_PATH}" \ -o ControlPersist=300 \ -o ConnectTimeout=10 \ -o ServerAliveInterval=60 \ -o ServerAliveCountMax=3 \ - ${SERVER} "$@" 2>&1 + ${SERVER} "$@" 2>&1) + local ssh_exit_code=$? + + # Si on détecte une erreur de socket, nettoyer et réessayer une fois + if echo "$ssh_output" | grep -q "ControlSocket.*already exists"; then + cleanup_dead_ssh + # Réessayer une fois après nettoyage + ssh -o ControlMaster=auto \ + -o ControlPath="${SSH_CONTROL_PATH}" \ + -o ControlPersist=300 \ + -o ConnectTimeout=10 \ + -o ServerAliveInterval=60 \ + -o ServerAliveCountMax=3 \ + ${SERVER} "$@" 2>&1 + return $? + fi + + # Afficher la sortie et retourner le code de sortie + echo "$ssh_output" + return $ssh_exit_code } # Nettoyer les connexions SSH persistantes et le répertoire temporaire à la fin