Les info-bulles suffisent : le texte fixe sous le formulaire allongeait la
fenetre sans rien apporter de plus.
L'explication reste accessible de deux façons : en survolant une entree de la
liste deroulante, et en survolant le champ lui-meme, dont l'info-bulle reprend
desormais celle du type selectionne. Sans cette seconde info-bulle, l'explication
n'aurait ete visible qu'en ouvrant la liste.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Double-clic sur un onglet pour le renommer, ou clic droit pour le menu. Le menu
contextuel permet aussi de fermer l'onglet vise ou tous les autres.
Le nom saisi est conserve tel quel : un onglet renomme "Serveur prod" ne
retrouve pas son libelle d'origine, y compris apres une reconnexion.
Un nom vide ou uniquement compose d'espaces est refuse, et annuler la saisie
laisse le nom inchange.
La fermeture des autres onglets parcourt la liste a l'envers : retirer un
onglet decale l'index des suivants, un parcours en avant en sauterait.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Choisir entre Ed25519, trois courbes NIST et RSA n'a de sens que si l'on sait
ce qu'elles impliquent. Chaque type dispose desormais d'un resume, affiche a la
fois en info-bulle dans la liste deroulante et sous le formulaire, mis a jour a
chaque changement de selection.
Chaque resume indique la courbe (ou l'absence de courbe pour RSA), l'equivalence
de robustesse avec RSA selon les recommandations du NIST (SP 800-57), la
compatibilite OpenSSH, et le cas d'usage : Ed25519 par defaut, ECDSA quand une
politique de conformite impose les courbes NIST, RSA pour du materiel ancien.
La reserve sur l'origine jamais expliquee des parametres des courbes NIST est
mentionnee, puisqu'elle motive le choix d'Ed25519 par defaut.
Le champ de taille en bits, qui ne concerne que RSA, est desormais active par la
meme fonction : un seul endroit gere la reaction au changement de type.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le panneau des sessions etait declare Movable|Floatable mais pas Closable : il
n'avait donc aucun bouton de fermeture et ne pouvait pas etre masque. Sa largeur
plancher etait par ailleurs imposee par son contenu, ce qui empechait de le
retrecir vraiment.
- ajout de DockWidgetClosable, largeur minimale ramenee a 120 px
- bascule par F9, par le menu Affichage, ou par la croix du panneau, les trois
restant synchronises
- separateur elargi a 6 px et surligne au survol, pour etre attrape facilement
Generation de cles : ajout d'ECDSA sur les courbes NIST P-256, P-384 et P-521,
en plus d'Ed25519 et RSA. Ed25519 reste le choix par defaut : c'est aussi une
courbe elliptique (Curve25519), plus courte et plus rapide, et sans les
interrogations qui entourent le choix des parametres des courbes NIST. Chaque
type est verifie relisible par paramiko, donc utilisable pour se connecter.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tunnels (redirection de ports), la specialite de Bitvise : un bouton dans la
barre d'un onglet SSH ouvre un gestionnaire de redirections.
- locale (-L) : un port de votre poste est relaye, via la connexion SSH, vers
une machine joignable depuis le serveur (typiquement un service qui n'ecoute
que sur la boucle locale du serveur)
- distante (-R) : l'inverse
Chaque tunnel tourne dans son propre thread, un relais bloque ne genant ni
l'interface ni les autres tunnels. Ils sont fermes avec la session.
Envoi simultane, façon MobaXterm : le bouton "Multi" diffuse la frappe vers
tous les onglets terminal. La diffusion ecrit directement dans les connexions
et non via les widgets terminal, sinon chaque onglet rediffuserait a son tour.
Reparation : un de mes scripts de correction avait reecrit main_window.py en
retraduisant deux fois les fins de ligne, produisant des sequences \r\r\n ;
le fichier avait ete committe ainsi (2538 lignes au lieu de 856, une ligne vide
inseree partout). Le contenu etait intact, seule la mise en forme etait touchee.
Le fichier est reconstitue par normalisation des fins de ligne, et un controle
d'integrite a ete ajoute a la verification de non-regression.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
L'emulateur de terminal etait deja le notre (pyte + QPainter) ; ce qui manquait
pour se rapprocher de MobaXterm, c'etait le *shell*. MobaXterm ne fournit pas
"son propre terminal" mais son propre bash, issu d'un Cygwin embarque : c'est ce
qui donne ls/grep/sed/awk/vi sous Windows.
Plutot que d'embarquer un binaire tiers, l'application detecte maintenant les
shells deja installes et les propose tous : PowerShell, cmd, Bash de Git for
Windows, MSYS2, Cygwin, WSL, et un busybox-w32 pose a cote de l'executable pour
les postes qui n'ont rien. Un shell Unix est choisi par defaut quand il y en a un.
Deux details qui bloquaient :
- pywinpty ne sait pas decouper une commande passee en chaine avec des
guillemets, et les chemins Windows en contiennent ("Program Files") : les
commandes sont donc des listes d'arguments.
- le bash de MSYS2 demarre sans jamais afficher d'invite si MSYSTEM n'est pas
definie ; chaque shell peut donc declarer ses variables d'environnement
(CHERE_INVOKING pour demarrer dans le dossier courant).
Les menus et l'arborescence sont generes depuis la detection, ils s'adaptent
donc au poste sans configuration.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Edition SFTP facon WinSCP : clic droit sur un fichier distant > "Editer".
Le fichier est telecharge dans un temporaire, ouvert avec l'application
associee du systeme, et renvoye automatiquement a chaque enregistrement.
Beaucoup d'editeurs enregistrent en remplacant le fichier plutot qu'en le
reecrivant : le chemin surveille disparait alors du QFileSystemWatcher, il est
donc reinscrit apres chaque renvoi pour que les enregistrements suivants
fonctionnent aussi.
Journalisation : un bouton dans la barre de l'onglet enregistre toute la
session dans un fichier. Les sequences d'echappement ANSI sont retirees pour
que le journal reste lisible dans un editeur de texte.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Zoom de police : Ctrl+molette et Ctrl+ +/-, Ctrl+0 pour revenir a la taille
par defaut. La taille choisie est memorisee entre deux lancements.
Barre de defilement de l'historique. pyte ne sait defiler que par demi-pages :
la barre est donc graduee en pages plutot qu'en lignes, ce qui donne un repere
visuel de position et permet de faire glisser. Maj+PagePrec/Suiv au clavier,
Ctrl+Fin pour revenir a la vue en direct.
Recherche dans l'historique (Ctrl+F) : la barre apparait en bas de l'onglet et
la recherche remonte l'historique page par page jusqu'a trouver, en
selectionnant la correspondance — donc visible et directement copiable.
Reconnexion en un clic : un bouton apparait dans la barre de l'onglet des que
la connexion tombe. La fabrication de la connexion a ete extraite dans
_create_connection(), ce qui permet de la recreer a l'identique sans ressaisir
quoi que ce soit. Utile avec des serveurs de test qui redemarrent souvent.
Les hotes deja approuves par la commande ssh (~/.ssh/known_hosts) sont
desormais reconnus, ce qui evite de reconfirmer une empreinte que votre ssh
connait deja. paramiko ne reecrit jamais ce fichier : les nouvelles cles
continuent d'aller dans celui de l'application.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Le terminal n'avait aucun copier-coller : impossible de selectionner du texte
a la souris ni de coller une commande. C'est la fonction la plus basique d'un
terminal et de loin le manque le plus penible a l'usage.
- selection a la souris avec surlignage, suivant le theme actif
- double-clic : selectionne le mot sous le curseur
- Ctrl+Shift+C / Ctrl+Shift+V, Maj+Inser, clic molette, menu au clic droit
- Ctrl+C reste l'interruption : les raccourcis du presse-papiers sont traites
avant la conversion Ctrl+lettre, sinon Ctrl+Shift+C serait parti comme un
Ctrl+C vers le shell
- au collage, les fins de ligne sont normalisees en retour chariot ; un \r\n
enverrait une ligne vide supplementaire au shell
La suite de tests vivait dans un dossier temporaire et aurait ete perdue : elle
rejoint le depot dans tests/ avec un lanceur. Elle couvre le presse-papiers, la
detection d'hote, la logique SFTP sur serveur simule et la construction de
l'application.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PyInstaller ne suit que les bibliotheques liees : il embarquait winpty.dll et
conpty.dll, mais ignorait les deux executables que pywinpty lance en
sous-processus pour creer la pseudo-console. Resultat, l'application se
lancait normalement mais tous les terminaux se fermaient instantanement
("Deconnecte (Terminal ferme)") — un defaut invisible en mode script, ou les
fichiers sont presents dans l'environnement virtuel.
- OpenConsole.exe : hote du backend ConPTY (celui utilise par defaut)
- winpty-agent.exe : requis par le repli WinPTY
Ils sont localises dans le paquet installe au moment du build, donc la recette
reste valable sur n'importe quel poste. Verifie sur l'executable produit :
OpenConsole.exe et powershell.exe apparaissent bien comme processus enfants.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reunit en un seul outil les fonctions utiles de MobaXterm, Termius et Bitvise,
sans compte ni service tiers, avec toutes les donnees en local.
- Terminaux multi-onglets : sessions SSH et terminaux Windows locaux
(PowerShell / cmd) via la pseudo-console native ConPTY
- Gestionnaire de fichiers SFTP facon WinSCP : double panneau, colonnes
triables, glisser-deposer, renommage, permissions, file de transferts.
Ouvrable sur une connexion en cours sans creer de favori
- Gestion des cles SSH : generation Ed25519/RSA, import, export
- Gestion du fichier known_hosts, avec remplacement guide d'une cle d'hote
modifiee (cas frequent des serveurs en DHCP)
- Trois themes (clair, bleu nuit, noir), commutables a chaud
- Authentification automatique reprenant le comportement de la commande ssh
(agent SSH et cles ~/.ssh), mot de passe demande seulement en secours
Aucun mot de passe n'est stocke sur le disque.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>