Florian ff4a73e6e6 feat: ajouter la recherche rapide Ctrl+K (Quick Connect)
Palette globale recherchant a travers sessions, hosts OpenSSH, workspaces,
snippets et actions courantes, avec recherche floue et navigation
entierement au clavier (fleches, Entree, Echap).

- app/services/fuzzy.py : correspondance par sous-sequence (comme fzf, sans
  dependance externe), score favorisant les caracteres consecutifs et les
  debuts de mot.
- QuickConnectDialog : collecte les resultats depuis les stores/controleurs
  deja existants (aucune duplication de logique - activer une session appelle
  ConnectionController.open_session(), un workspace WorkspaceManager.restore(),
  un snippet insert_snippet() dans l'onglet courant, sans jamais l'executer
  automatiquement). Les actions (Nouvelle session, Gestionnaires...) reutilisent
  les methodes des controleurs/dialogues existants.
- Ctrl+K (menu Fichier > Recherche rapide...) ouvre la palette, reconstruite
  a chaque ouverture pour refleter l'etat courant.
- insert_snippet()/execute_snippet() rendus publics sur BaseTerminalTab
  (utilises depuis un autre module par la palette).

tests/test_fuzzy.py (scoring, tri par pertinence) et test_quick_connect.py
(collecte des 4 types de resultats + actions, filtrage, navigation clavier,
activation reelle d'une session et d'un snippet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 03:00:07 +02:00
2026-09-04 06:50:10 +02:00
2026-09-04 06:50:10 +02:00

PySSH Client

Client SSH/SFTP personnel (type MobaXterm/Termius/Bitvise), 100% local, sans compte ni service tiers.

Fonctionnalites

  • Sessions SSH multiples dans des onglets, avec terminal ANSI colore et trois themes
  • Copier-coller a la souris, comme dans un terminal Unix : selectionner copie aussitot (double-clic pour un mot), et le clic droit colle directement — ni menu, ni raccourci. Le clic molette colle aussi. Ctrl+Shift+C / Ctrl+Shift+V / Maj+Inser restent disponibles au clavier, et Ctrl+C reste l'interruption comme dans tout terminal
  • Confort d'affichage : zoom Ctrl+molette ou Ctrl+ +/- (Ctrl+0 remet a zero, la taille est memorisee), barre de defilement de l'historique, Maj+PagePrec/Suiv, Ctrl+Fin pour revenir en direct, et recherche dans l'historique avec Ctrl+F
  • Onglets renommables (double-clic sur l'onglet, ou clic droit) et deplaçables ; le clic droit permet aussi de fermer les autres onglets
  • Panneau des sessions redimensionnable en attrapant le separateur, et masquable entierement (F9, menu Affichage, ou la croix du panneau) pour donner tout l'ecran au terminal
  • Tunnels SSH (redirection de ports) : bouton "Tunnels" dans la barre d'un onglet SSH. Redirection locale (-L) pour atteindre depuis votre poste un service qui n'ecoute que sur la boucle locale du serveur, et redirection distante (-R) dans l'autre sens
  • Envoi simultane : le bouton "⇉ Multi" du panneau lateral diffuse ce que vous tapez vers tous les onglets terminal ouverts, pour piloter plusieurs serveurs d'un coup
  • Journalisation de session dans un fichier (bouton "Journal"), sequences ANSI retirees pour rester lisible
  • Reconnexion en un clic quand une session tombe (bouton dans la barre de l'onglet) : pratique avec des serveurs de test qui redemarrent souvent
  • Les hotes deja approuves par votre commande ssh (~/.ssh/known_hosts) sont reconnus : pas de double confirmation d'empreinte. Les nouvelles cles vont dans le fichier propre a l'application
  • Terminaux locaux accessibles en un clic, sans session enregistree. L'application detecte les shells presents sur le poste et les propose tous : PowerShell, cmd, et surtout les shells Unix s'ils sont installes (Bash de Git for Windows, MSYS2, Cygwin, WSL, ou un busybox pose a cote de l'application). Comme le terminal local de MobaXterm, on retrouve alors ls, grep, sed, awk, vi, scp... sous Windows. Un shell Unix est choisi par defaut quand il y en a un ; sinon PowerShell. Rien n'est embarque : l'application reutilise ce qui est deja installe
  • Carnet d'adresses de serveurs (JSON local, data/sessions.json) organise par dossiers, connexion en un clic
  • Gestion des cles SSH : generation Ed25519, ECDSA (courbes NIST P-256 / P-384 / P-521) et RSA, import de cles existantes, export (cle publique/privee), protection par passphrase
  • Client SFTP integre facon WinSCP : double panneau local/distant avec colonnes triables (nom, taille, date, droits), glisser-deposer entre les panneaux, renommage (F2), suppression (Suppr), creation de dossier, permissions distantes (chmod), et file de transferts avec progression. Aucun favori n'est necessaire pour l'utiliser — voir ci-dessous
  • SFTP sur la connexion en cours : depuis n'importe quel terminal ou vous avez tape ssh user@hote a la main, le bouton "📁 SFTP sur cette connexion" lit l'hote, l'utilisateur et le port dans la commande saisie et ouvre le gestionnaire de fichiers dessus. Pense pour les serveurs de test en DHCP, qu'on n'a aucune envie d'enregistrer
  • Authentification automatique (mode par defaut) : comme la commande ssh, l'application utilise l'agent SSH et les cles de ~/.ssh sans que vous ayez a designer quoi que ce soit, et ne demande un mot de passe qu'en dernier recours
  • Verification des empreintes de cles d'hote (TOFU) avant premiere connexion, comme un client SSH classique
  • Gestionnaire des hotes connus (menu "Hotes connus" ou bouton "⚙" du panneau lateral) : si une adresse en DHCP change de machine, la cle d'hote presentee ne correspond plus a celle enregistree — l'application le detecte et propose de remplacer l'ancienne entree directement au moment de la connexion, sans avoir a vider le fichier known_hosts a la main. Le gestionnaire permet aussi un nettoyage manuel (par hote ou en une fois).

Aucun mot de passe n'est stocke sur le disque : l'authentification par mot de passe est demandee a chaque connexion, et les passphrases de cles sont demandees uniquement en memoire au moment de la connexion.

Installation (Windows)

Necessite Python 3.10+ installe sur le poste (verifiable avec py -3 --version).

setup.bat

Ce script cree un environnement virtuel local (venv/) et y installe les dependances (PySide6, paramiko, pyte, cryptography, pywinpty) — rien n'est installe globalement sur le poste.

Lancement

Trois facons, au choix :

  • Raccourci Windows (recommande) : double-cliquez sur PySSH Client.lnk a la racine du projet. Il lance l'application via pythonw.exe, donc sans fenetre de console noire. Vous pouvez le copier sur le Bureau, ou l'epingler a la barre des taches. Pour le (re)creer — apres un deplacement du projet, ou sur un autre poste :

    powershell -ExecutionPolicy Bypass -File tools\create_shortcut.ps1 -Desktop
    

    (-Desktop et -StartMenu sont optionnels et ajoutent une copie a ces emplacements.)

  • En ligne de commande, sans console residuelle :

    venv\Scripts\pythonw.exe main.py
    
  • run.bat : garde une fenetre de console ouverte, ce qui est pratique pour voir les erreurs si l'application refuse de demarrer.

Version portable (sans Python installe)

build_exe.bat

Produit un dossier autonome dist\PySSH Client\ contenant l'executable et tout ce dont il a besoin, interpreteur Python compris. Copiez ce dossier ou vous voulez (y compris sur une cle USB) : il fonctionne sur n'importe quel poste Windows, meme sans Python installe.

Le format retenu est un dossier plutot qu'un fichier .exe unique : avec PySide6, un executable unique doit decompresser environ 200 Mo a chaque lancement, ce qui ajoute plusieurs secondes d'attente a chaque demarrage. Le dossier demarre immediatement.

Note pour qui modifie la recette de build (PySSHClient.spec) : pywinpty a besoin de deux executables auxiliaires, OpenConsole.exe (backend ConPTY) et winpty-agent.exe (repli WinPTY). PyInstaller ne suit que les DLL liees et les oublie : ils sont donc ajoutes explicitement dans datas. Sans eux, l'application se lance normalement mais tous les terminaux se ferment instantanement ("Deconnecte (Terminal ferme)").

Ou sont stockees les donnees ? A cote de l'executable, dans son propre sous-dossier data\ (mode portable : vos sessions et cles suivent la cle USB). Si cet emplacement n'est pas accessible en ecriture — installation dans Program Files, support en lecture seule — l'application bascule automatiquement sur %APPDATA%\PySSHClient\.

Premiers pas

  1. Terminal local immediat : bouton "💻 Terminal" dans le panneau lateral (ou Ctrl+Shift+T), ou double-clic sur "PowerShell"/"Invite de commandes" dans la section "Terminaux locaux" de l'arborescence — aucune session a creer.

  2. Nouvelle session SSH (bouton "+ Session" ou Ctrl+N) : renseignez l'hote, le port, l'utilisateur et le mode d'authentification.

  3. Cles SSH (menu "Cles SSH > Gestionnaire de cles") : generez une nouvelle paire de cles ou importez-en une existante, puis selectionnez-la dans le formulaire de session.

  4. Double-cliquez sur une session dans l'arborescence pour ouvrir un onglet terminal SSH.

  5. SFTP — trois facons d'y arriver, selon la situation :

    • Vous avez tape ssh user@hote dans un terminal : bouton "📁 SFTP sur cette connexion" dans la barre de l'onglet. L'hote et l'utilisateur sont deduits de la commande, le formulaire est pre-rempli. Rien a enregistrer.
    • Connexion ponctuelle : bouton "📁 SFTP" du panneau lateral, ou Ctrl+Shift+F. La case "Enregistrer dans mes sessions" est decochee par defaut.
    • Session enregistree : clic droit > "Ouvrir en SFTP" (onglet dedie). Dans une session SSH ouverte par l'application, le panneau de fichiers est deja affiche a cote du terminal, comme dans MobaXterm.

    Dans tous les cas : glisser-deposer entre les deux panneaux, F2 renomme, Suppr supprime, F5 actualise, et le clic droit sur le panneau distant donne acces aux permissions (chmod).

Structure du projet

main.py                    point d'entree
app/
  theme.py                  feuille de style "bleu nuit" + icone d'application
  session_manager.py       base de sessions (JSON)
  key_manager.py           generation/import/export de cles SSH
  ssh_connection.py        connexion SSH en arriere-plan (paramiko + QThread)
  known_hosts_manager.py   gestion du fichier known_hosts (lister/retirer/remplacer une cle d'hote)
  local_terminal.py         terminal local Windows (PowerShell/cmd via pywinpty)
  terminal_widget.py       emulateur de terminal ANSI (pyte + QPainter)
  sftp_panel.py             client SFTP a deux panneaux
  main_window.py            fenetre principale (arbre de sessions + onglets)
  tunnels.py                tunnels SSH (redirection de ports -L / -R)
  dialogs/                  boites de dialogue (session, cles, hotes, tunnels, connexion)
resources/
  theme.qss                  feuille de style Qt "bleu nuit"
data/
  sessions.json             vos serveurs enregistres (non versionne)
  keys.json                 registre des cles connues (non versionne)
  keys/                      cles generees par l'application (non versionne)
  known_hosts                empreintes d'hotes approuvees (non versionne)

Tests

tests\run_all.bat

Les tests construisent de vraies fenetres Qt sans les afficher (QT_QPA_PLATFORM=offscreen) et couvrent : le copier-coller et les raccourcis du terminal, la detection de l'hote dans une commande ssh tapee a la main, la logique SFTP (transferts, renommage, tri, suppression recursive) avec un serveur simule, et la construction complete de l'application.

Limites connues / pistes d'amelioration

  • L'emulation de terminal couvre les usages courants (bash, vim, htop...) mais n'est pas un xterm parfaitement complet.
  • Le terminal local repose sur pywinpty (pseudo-console Windows). Si un onglet local reste bloque sur un ecran vide, tapez une touche : le rafraichissement de la console Windows peut etre paresseux dans certains contextes (notamment les sessions Windows non interactives) et se declenche a la premiere frappe.
  • Le SFTP ne propose pas encore l'edition de fichier distant en place (telecharger / modifier / renvoyer a la main).
  • Pas encore d'export/import global du carnet de sessions (le fichier data/sessions.json peut etre copie manuellement).
Description
Client SSH/SFTP personnel pour Windows : terminaux multi-onglets, gestionnaire de fichiers SFTP integre, gestion des cles SSH. 100% local, sans compte ni service tiers.
Readme 596 KiB
Languages
Python 99.4%
Batchfile 0.3%
PowerShell 0.3%