🚀 xsshend
xsshend est un outil Rust moderne et efficace pour le téléversement parallèle de fichiers vers multiples serveurs SSH. Il offre une interface TUI (Terminal User Interface) hiérarchique intuitive avec suivi en temps réel des transferts.
🔧 Installation
Via Cargo (recommandé)
Depuis les sources
📚 Documentation
- Documentation complète
- Guide d'utilisation
- Sélection des clés SSH
- Configuration automatique
- Gestion des clés SSH
- Optimisation
✨ Fonctionnalités principales
- 🌳 Interface hiérarchique moderne pour la sélection de serveurs
- 🔄 Téléversement parallèle vers plusieurs serveurs SSH simultanément
- 🎯 Barres de progression en temps réel pour chaque serveur
- 🔍 Recherche intégrée pour filtrer rapidement les serveurs
- 🔐 Authentification sécurisée par clés SSH avec support agent SSH
- 🔑 Sélection interactive de clés SSH avec découverte automatique
- 🎛️ Sélection CLI de clés SSH avec options
--ssh-keyet--ssh-key-interactive - 📊 Configuration hiérarchique des serveurs (environnements, régions, types)
- ⚡ Performance optimisée avec threading natif Rust
- 🛡️ Gestion d'erreurs robuste avec rapports détaillés
- 📁 Support multi-fichiers avec sélection interactive
- 🎮 Modes d'utilisation flexibles : interface complète, interactif, ligne de commande
- 🎨 Thème adaptatif : Détection automatique des thèmes clair/sombre du terminal
- 🌈 Interface optimisée : Couleurs et contrastes adaptés pour une meilleure lisibilité
🎮 Interface utilisateur
Interface hiérarchique de sélection
L'interface organise vos serveurs en arbre navigable :
📂 Production
├── 🌐 Region-A
│ ├── 📊 Public
│ │ ├── ✅ WEB_SERVER_01 (web01@prod-web-01.example.com)
│ │ └── �️ API_SERVER_01 (api01@prod-api-01.example.com)
│ └── 📋 Private
│ └── 🖥️ DATABASE_01 (db01@prod-db-01.example.com)
└── 🌐 Region-B
└── 📊 Public
└── 🖥️ CACHE_SERVER_01 (cache01@prod-cache-01.example.com)
Navigation intuitive
- ↑↓ : Navigation dans l'arbre
- → ← : Déplier/réduire les nœuds
- Espace : Sélectionner des serveurs
- / : Recherche en temps réel
- a : Sélectionner tout / c : Vider la sélection
🏗️ Architecture de configuration
Production/
├── Region-A/
│ ├── Public/ # Serveurs publics
│ └── Private/ # Serveurs internes
└── Region-B/
├── Public/
└── Private/
Staging/
├── Region-A/
└── Region-B/
Development/
└── Local/
🚀 Installation
Prérequis
- Rust 2024 ou plus récent
- OpenSSH configuré avec clés SSH
- Fichier de configuration
~/.ssh/hosts.json
Compilation
# Cloner le projet
# Compiler en mode release
# Installer globalement
🔑 Gestion des clés SSH
Détection automatique
xsshend détecte automatiquement les clés SSH disponibles dans ~/.ssh/ :
- Clés supportées :
id_ed25519,id_rsa,id_ecdsa,id_dsa - Gestion des clés avec passphrase
- Support complet de ssh-agent
Sélection de clés en ligne de commande
# Sélection interactive - affiche un menu pour choisir parmi les clés disponibles
# Spécification directe par nom de fichier (sans extension)
# Sélection automatique forcée de la meilleure clé (Ed25519 > RSA > ECDSA)
# Comportement par défaut : sélection intelligente
# Affiche les clés détectées et sélectionne automatiquement la meilleure
# Suggère l'utilisation de --ssh-key-interactive pour un choix manuel
Priorité de sélection automatique
- Ed25519 - Recommandé pour la sécurité et les performances
- RSA - Compatibilité étendue
- ECDSA - Alternative moderne
- Autres - Support basique
Intégration ssh-agent
Si aucune clé n'est sélectionnée ou disponible, xsshend utilise automatiquement ssh-agent pour l'authentification.
🎨 Thèmes et accessibilité
Détection automatique du thème
xsshend s'adapte automatiquement au thème de votre terminal :
- Thème sombre : Couleurs optimisées pour les fonds sombres
- Thème clair : Contraste amélioré pour les fonds clairs
- Détection intelligente : Utilise les APIs du terminal pour la détection
Lisibilité optimisée
- Contraste automatique pour tous les éléments
- Titres de panneaux bien visibles
- Éléments non sélectionnés lisibles
- Panneau d'aide avec bon contraste
⚙️ Configuration
Fichier hosts.json
Créez le fichier ~/.ssh/hosts.json avec la structure suivante :
Clés SSH
Assurez-vous que vos clés SSH publiques sont déployées sur tous les serveurs cibles :
# Copier votre clé publique vers un serveur
# Ou ajouter manuellement dans ~/.ssh/authorized_keys sur le serveur distant
🎮 Utilisation
1. Interface complète (recommandé)
Lancez l'application pour accéder à l'interface hiérarchique complète :
# Interface TUI complète avec workflow guidé
# Ou explicitément en mode interactif
Workflow guidé :
- Sélection des fichiers - Navigateur de fichiers intuitif
- Sélection des serveurs - Interface hiérarchique avec recherche
- Destination - Saisie du répertoire cible
- Téléversement - Progression en temps réel
2. Mode interactif avec fichiers pré-sélectionnés
# Avec fichiers spécifiés, interface pour serveurs et destination
# Ou via sous-commande
3. Mode ligne de commande
# Téléversement direct avec filtres
# Filtrer par région
# Filtrage par environnement (nouveau!)
# Filtrage combiné environnement + région
# Filtrage combiné environnement + type
# Gestion des clés SSH - nouvelles options!
# Sélection interactive de la clé SSH
# Spécifier une clé SSH par nom (sans extension)
# Forcer la sélection automatique de la meilleure clé
# Par défaut : sélection intelligente avec suggestion
4. Lister les serveurs avec étiquettes hiérarchiques
# Lister les serveurs disponibles avec étiquettes CLI
# ou
Exemple de sortie enrichie :
🔍 Liste des cibles SSH disponibles:
📁 Production (--env Production)
📂 Region-A (--region Region-A)
📂 Public (--type Public)
🖥️ WEB_SERVER_01 → web01@prod-web-01.example.com (PROD)
🖥️ API_SERVER_01 → api01@prod-api-01.example.com (PROD)
📂 Private (--type Private)
�️ DATABASE_01 → db01@prod-db-01.example.com (PROD)
📁 Staging (--env Staging)
📂 Region-A (--region Region-A)
📂 Public (--type Public)
🖥️ STAGE_WEB_01 → web01@stage-web-01.example.com (STAGE)
📊 Total: 4 cibles disponibles
�💡 Exemples d'utilisation:
xsshend upload --env Production file.txt
xsshend upload --env Staging --region Region-A file.txt
xsshend upload --region Region-A --type Public file.txt
5. Gestion robuste des serveurs déconnectés
xsshend gère maintenant gracieusement les serveurs inaccessibles :
# Vérification de connectivité avant l'interface TUI
# Les timeouts de connexion sont configurés pour éviter les blocages
# Les erreurs de connexion sont logguées mais n'interrompent pas les autres transferts
5. Modes de filtrage avancés
# Filtrage par environnement complet
# Filtrage par environnement et région
# Filtrage par environnement et type de serveurs
# Filtrage traditionnel par région ou type uniquement
# Vérification de connectivité avant transfert
Workflow interactif en 4 étapes :
- 📁 Sélection de fichiers - Naviguez et sélectionnez vos fichiers
- 🖥️ Sélection de serveurs - Choisissez vos serveurs cibles
- 📂 Saisie de destination - Spécifiez le répertoire de destination ⭐
- ⚡ Transferts parallèles - Surveillez les transferts en temps réel
⭐ Important : L'étape de saisie du répertoire de destination est présente et fonctionnelle dans le TUI. Utilisez Tab/Entrée pour naviguer entre les étapes.
Interface en Ligne de Commande
# Téléverser un fichier vers tous les serveurs disponibles
# Téléverser vers un environnement spécifique
# Téléverser vers une région spécifique
# Téléverser vers des serveurs publics uniquement
# Téléverser vers un environnement ET une région
# Téléverser vers un environnement ET un type
# Téléverser plusieurs fichiers
# Mode interactif avec sélection de serveurs
# Spécifier le répertoire de destination
# Mode verbeux avec logs détaillés
# Vérifier la connectivité avant le TUI (n'affiche que les serveurs en ligne)
Interface de Progression
L'interface de progression se lance automatiquement et affiche des barres de progression en temps réel :
🚀 Début du téléversement:
📁 1 fichier(s)
🖥️ 3 serveur(s)
📂 Destination: /opt/uploads/
📤 Téléversement de ./myapp.jar vers /opt/uploads/myapp.jar...
Taille: 2.3 MB
web01@prod-web-01... [████████████████████████████████] 2.3MB/2.3MB (00:02)
api01@prod-api-01... [██████████████████ ] 1.5MB/2.3MB (00:01)
db01@stage-db-01.... [████████████████████████████ ] 2.1MB/2.3MB (00:00)
📊 Résumé du téléversement:
✅ WEB_SERVER_01 - 2,359,296 octets
✅ API_SERVER_01 - 2,359,296 octets
✅ DATABASE_01 - 2,359,296 octets
✅ Téléversement terminé avec succès!
Options Avancées
# Exclure certains serveurs
# Timeout personnalisé
# Nombre max de connexions parallèles
# Mode dry-run (simulation)
# Forcer l'écrasement de fichiers existants
# Utiliser SCP au lieu de SFTP
🔧 Stack Technologique
Crates Principales
ssh2- Connectivité SSH/SFTP robusteindicatif- Barres de progression multi-threadsdialoguer- Prompts interactifs élégantsclap- Parsing d'arguments CLI modernerayon- Parallélisation efficacecrossterm- Contrôle terminal cross-platformserde- Sérialisation JSONrpassword- Saisie sécurisée de passphraseanyhow- Gestion d'erreurs ergonomique
📋 Note : Une interface TUI complète avec contrôles interactifs (pause, reprise, logs) est prévue pour la version 0.2.0
Architecture du Code
src/
├── main.rs # Point d'entrée et CLI
├── config/
│ ├── mod.rs
│ └── hosts.rs # Parsing hosts.json
├── ssh/
│ ├── mod.rs
│ ├── client.rs # Client SSH/SFTP
│ ├── auth.rs # Authentification (placeholder)
│ └── transfer.rs # Transfert avec barres de progression
├── ui/
│ ├── mod.rs
│ └── prompts.rs # Dialogues interactifs
├── core/
│ ├── mod.rs
│ ├── uploader.rs # Orchestrateur principal
│ ├── parallel.rs # Gestion parallélisme (placeholder)
│ └── validator.rs # Validation fichiers/serveurs
└── utils/
├── mod.rs
├── env_expansion.rs # Expansion variables d'environnement
├── errors.rs # Types d'erreurs
└── logger.rs # Système de logs (placeholder)
🛠️ Développement
Prérequis Développement
# Installer les outils de développement
# Installer cargo-watch pour le développement
Commandes Utiles
# Développement avec rechargement automatique
# Tests
# Linting
# Formatage
# Vérification complète
# Benchmark de performance
# Documentation
Structure des Tests
🧪 Tests et Validation
Tests Unitaires
Tests d'Intégration en Conditions Réelles
Un module de test complet avec Multipass permet de tester xsshend sur de vraies VMs Ubuntu :
# Démonstration complète automatisée
# Ou setup manuel
Environnement de Test
- 5 VMs Ubuntu 22.04 simulant Dev/Staging/Production
- SSH configuré automatiquement avec clés de test
- Tests parallèles sur plusieurs serveurs simultanément
- Fichiers variés : texte, JSON, binaires, gros fichiers (1MB)
- Isolation complète : aucun impact sur vos serveurs
Suite de Tests Automatisés
✅ Interface CLI et aide
✅ Configuration hosts.json et filtrage
✅ Mode dry-run (simulation)
✅ Transfert simple et multiple
✅ Barres de progression (gros fichiers)
✅ Transferts parallèles multi-serveurs
✅ Gestion d'erreurs robuste
✅ Tests de performance et stress
Résultat attendu : 9/9 tests passent = prêt pour production !
📖 Documentation
Consultez la documentation complète dans le répertoire docs/ :
- Guide d'utilisation - Utilisation détaillée de l'interface hiérarchique
- Configuration - Configuration avancée et personnalisation
Liens rapides
- Navigation dans l'interface : docs/usage.md#navigation-dans-linterface
- Configuration des serveurs : docs/configuration.md#fichier-de-configuration-principal
- Raccourcis et alias : docs/configuration.md#raccourcis-et-personnalisation
🔧 Configuration avancée
Voir le guide de configuration pour :
- Organisation optimale de l'infrastructure
- Variables d'environnement et personnalisation
- Raccourcis shell et scripts de déploiement
- Résolution des problèmes courants
� Dépannage
Problèmes courants
Erreur: "Permission denied (publickey)"
# Vérifier la configuration SSH
# Vérifier l'agent SSH
# Ajouter la clé si nécessaire
Erreur: "hosts.json not found"
# Créer le fichier de configuration
# Créer et éditer avec vos serveurs
Serveurs déconnectés ou inaccessibles
# Utiliser --online-only pour pré-filtrer les serveurs accessibles
# Les timeouts de connexion sont configurés automatiquement (5 secondes par défaut)
# En cas d'échec de connexion, xsshend continue avec les autres serveurs
# Vérifier la connectivité manuellement
# Logs d'erreur détaillés pour identifier les problèmes
RUST_LOG=debug
Performances lentes
# Réduire le parallélisme via variable d'environnement
Consultez le guide de configuration pour plus de solutions.
📝 Logs et Debug
# Mode verbeux
RUST_LOG=debug
# Affichage détaillé des transferts
# Mode trace pour debugging SSH
RUST_LOG=ssh2=trace
🤝 Contribution
Les contributions sont les bienvenues ! Veuillez suivre ces étapes :
- Fork le projet
- Créer une branche feature (
git checkout -b feature/ma-fonctionnalite) - Commiter vos changements (
git commit -am 'Ajoute ma fonctionnalité') - Pousser vers la branche (
git push origin feature/ma-fonctionnalite) - Ouvrir une Pull Request
Standards de Code
- Code formaté avec
cargo fmt - Linting sans warnings avec
cargo clippy - Tests passants avec
cargo test - Documentation mise à jour
📄 Licence
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
🙏 Remerciements
- clap-rs pour l'excellent framework CLI
- ssh2-rs pour les bindings SSH robustes
- indicatif pour les barres de progression élégantes
- Communauté Rust pour l'écosystème exceptionnel
xsshend - Téléversement SSH parallèle, simple et efficace 🚀