From 5fc0c41df5900c35a66f6ef28f955cc55c04ee75 Mon Sep 17 00:00:00 2001 From: Admin MPCZ Date: Wed, 29 Apr 2026 14:52:42 +0200 Subject: [PATCH] fix(ssh): puttygen multi-syntaxe (private-openssh / private-openssh-new) + message GUI explicite si aucune syntaxe ne marche --- patch_manager_v2.py | 50 +++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/patch_manager_v2.py b/patch_manager_v2.py index 13e7b5b..589b196 100644 --- a/patch_manager_v2.py +++ b/patch_manager_v2.py @@ -691,33 +691,53 @@ def load_key(keyfile): is_ppk = first_line.startswith("PuTTY-User-Key-File-") if is_ppk: - # Paramiko ne lit pas .ppk nativement → tenter conversion auto via puttygen + # Paramiko ne lit pas .ppk nativement → tenter conversion auto via puttygen. + # Ordre des syntaxes (de la plus moderne à la plus large) : + # PuTTY 0.74+ : -O private-openssh + # PuTTY 0.75+ : -O private-openssh-new + # Avant 0.74 : pas de CLI export → conversion GUI obligatoire. converted = keyfile + ".openssh" puttygen_paths = [ r"C:\Program Files\PuTTY\puttygen.exe", r"C:\Program Files (x86)\PuTTY\puttygen.exe", - "puttygen", # si dans PATH + "puttygen", "puttygen.exe", ] + export_syntaxes = [ + ["-O", "private-openssh", "-o", converted], + ["-O", "private-openssh-new", "-o", converted], + ] import subprocess converted_ok = False + last_stderr = "" for pg in puttygen_paths: - try: - subprocess.run( - [pg, keyfile, "-O", "private-openssh", "-o", converted], - check=True, capture_output=True, timeout=10, - ) - converted_ok = True + for syntax in export_syntaxes: + try: + proc = subprocess.run( + [pg, keyfile] + syntax, + capture_output=True, timeout=10, text=True, + ) + if proc.returncode == 0 and os.path.exists(converted): + converted_ok = True + break + last_stderr = (proc.stderr or proc.stdout or "").strip() + except (FileNotFoundError, subprocess.SubprocessError, OSError) as ex: + last_stderr = str(ex) + continue + if converted_ok: break - except (FileNotFoundError, subprocess.SubprocessError, OSError): - continue if not converted_ok: load_key.last_error = ( - f"Format PuTTY (.ppk) détecté pour {os.path.basename(keyfile)}. " - f"Paramiko ne lit pas ce format nativement et puttygen.exe est introuvable. " - f"Convertir manuellement : " - f'puttygen "{keyfile}" -O private-openssh -o "{keyfile}.openssh" ' - f"puis pointer la conf vers le fichier converti." + f"Format PuTTY (.ppk) détecté pour {os.path.basename(keyfile)}.\n" + f"Paramiko ne lit pas ce format. La conversion automatique via puttygen a échoué " + f"(version ancienne ou puttygen absent).\n\n" + f"Détail dernière tentative : {last_stderr or 'aucun'}\n\n" + f"CONVERSION MANUELLE (PuTTYgen GUI, ~30s) :\n" + f" 1. Ouvrir puttygen.exe (sans arguments, en GUI)\n" + f" 2. Bouton 'Load' → choisir {keyfile}\n" + f" 3. Menu 'Conversions' → 'Export OpenSSH key'\n" + f" 4. Enregistrer sous '{keyfile.rsplit('.', 1)[0]}' (sans .ppk)\n" + f" 5. Dans les paramètres ci-dessous, pointer la clé vers le fichier converti" ) return None keyfile = converted