# đ xsshend
[](https://crates.io/crates/xsshend)
[](https://docs.rs/xsshend)
[](https://opensource.org/licenses/MIT)
[](https://www.rust-lang.org)
[](SECURITY.md)
**xsshend** est un outil Rust moderne et efficace pour le **téléversement de fichiers vers multiples serveurs SSH**. Interface en ligne de commande simple et intuitive avec suivi en temps réel des transferts.
## đ§ Installation
### Pré-requis
- Rust 1.70+ (recommandé: version stable la plus récente)
- OpenSSL (optionnel, pour accélérer la compilation)
### Via Cargo (recommandé)
```bash
cargo install xsshend
```
#### đ AccĂ©lĂ©rer l'installation
L'installation peut ĂȘtre longue car elle compile OpenSSL depuis les sources par dĂ©faut. Pour accĂ©lĂ©rer :
**Option 1 : Utiliser OpenSSL du systĂšme (Linux/macOS)**
```bash
# Installer OpenSSL si nécessaire
# Ubuntu/Debian:
sudo apt-get install libssl-dev pkg-config
# Fedora/RHEL:
sudo dnf install openssl-devel
# macOS:
brew install openssl pkg-config
# Installer xsshend (utilise OpenSSL systĂšme automatiquement)
cargo install xsshend
```
**Option 2 : Compilation parallĂšle**
```bash
# Utiliser tous les cĆurs CPU disponibles
cargo install xsshend -j $(nproc)
```
### Depuis les sources
```bash
git clone https://github.com/willisback/xsshend.git
cd xsshend
cargo install --path .
```
## đ Documentation
- [**Documentation complĂšte**](https://willisback.github.io/xsshend/)
- [Guide d'utilisation](#-utilisation)
- [Configuration](#%EF%B8%8F-configuration)
- [**Politique de sécurité**](SECURITY.md)
## đ Note de SĂ©curitĂ©
â ïž **VulnĂ©rabilitĂ© connue**: xsshend dĂ©pend de `russh` qui utilise `rsa 0.9.8`, affectĂ© par [RUSTSEC-2023-0071](https://rustsec.org/advisories/RUSTSEC-2023-0071) (Marvin Attack - timing sidechannel).
**Recommandations** :
- â
Utilisez des **clés Ed25519** plutÎt que RSA (non affectées)
- â
Utilisez xsshend sur des **réseaux de confiance** (internes, VPN)
- â ïž Ăvitez l'utilisation sur des **rĂ©seaux publics non sĂ©curisĂ©s**
**Contexte** : Aucun correctif n'est disponible actuellement. Cette vulnérabilité permet potentiellement la récupération de clés RSA via l'observation du timing réseau. Les clés Ed25519 et ECDSA ne sont pas affectées.
**Détails complets** : Consultez [SECURITY.md](SECURITY.md) pour plus d'informations et les recommandations détaillées.
## ⚠Fonctionnalités principales
- đŻ **TĂ©lĂ©versement simple** vers plusieurs serveurs SSH
- đ **Barres de progression** en temps rĂ©el pour chaque transfert
- đ **Authentification sĂ©curisĂ©e** par clĂ©s SSH avec dĂ©couverte automatique
- đ **Filtrage avancĂ©** par environnement, rĂ©gion et type de serveur
- đïž **Configuration hiĂ©rarchique** des serveurs (environnements, rĂ©gions, types)
- đĄïž **Gestion d'erreurs robuste** avec rapports dĂ©taillĂ©s
- đ **Support multi-fichiers** avec validation automatique
- ⥠**Mode dry-run** pour simulation sans transfert réel
- đ§Ș **Suite de tests complĂšte** avec 93 tests automatisĂ©s
## đ DĂ©marrage rapide
### 1. Initialisation
```bash
# Initialiser la configuration avec assistant interactif
xsshend init
# Forcer la réinitialisation
xsshend init --force
```
### 2. Configuration des serveurs
Créez le fichier `~/.ssh/hosts.json` avec la structure hiérarchique :
```json
{
"Production": {
"Region-A": {
"Public": {
"WEB_SERVER_01": {
"alias": "web01@prod-web-01.example.com",
"env": "PROD"
},
"API_SERVER_01": {
"alias": "api01@prod-api-01.example.com",
"env": "PROD"
}
},
"Private": {
"DATABASE_01": {
"alias": "db01@prod-db-01.example.com",
"env": "PROD"
}
}
}
},
"Staging": {
"Region-A": {
"Public": {
"STAGE_WEB_01": {
"alias": "web01@stage-web-01.example.com",
"env": "STAGE"
}
}
}
},
"Development": {
"Local": {
"Services": {
"DEV_DATABASE": {
"alias": "dev@dev-db.local.example.com",
"env": "DEV"
}
}
}
}
}
```
### 3. Utilisation
```bash
# Lister les serveurs disponibles
xsshend list
# Téléverser un fichier vers tous les serveurs
xsshend upload myfile.txt
# Filtrer par environnement
xsshend upload config.json --env Production
# Mode dry-run (simulation)
xsshend upload deploy.sh --env Production --dry-run
```
## đź Utilisation
### Commandes principales
```bash
# Aide générale
xsshend --help
# Initialiser la configuration
xsshend init [--force]
# Lister les serveurs disponibles
xsshend list
# ou
xsshend --list
# Téléverser des fichiers
xsshend upload <FILES>... [OPTIONS]
```
### Options de téléversement
```bash
# Filtrage par environnement
xsshend upload file.txt --env Production
xsshend upload file.txt --env Staging
xsshend upload file.txt --env Development
# Filtrage par région
xsshend upload file.txt --region Region-A
xsshend upload file.txt --region Region-B
# Filtrage par type de serveur
xsshend upload file.txt --type Public
xsshend upload file.txt --type Private
# Filtrage combiné
xsshend upload config.json --env Production --region Region-A
xsshend upload deploy.sh --env Production --type Public
xsshend upload app.war --env Staging --region Region-A --type Public
# Spécifier la destination
xsshend upload file.txt --dest /opt/app/
xsshend upload file.txt --dest /var/www/html/
# Mode simulation (dry-run)
xsshend upload file.txt --env Production --dry-run
# Téléverser plusieurs fichiers
xsshend upload file1.txt file2.json directory/
```
### Exemples d'utilisation
```bash
# Déploiement en production
xsshend upload app.war --env Production --dest /opt/tomcat/webapps/
# Mise Ă jour de configuration de staging
xsshend upload config.json --env Staging --dest /etc/myapp/
# Déploiement sur serveurs publics uniquement
xsshend upload static-files/ --env Production --type Public --dest /var/www/
# Simulation d'un déploiement
xsshend upload deploy.sh --env Production --dry-run
# Upload vers une région spécifique
xsshend upload regional-config.json --env Production --region Region-A
```
### Interface de progression
Les transferts affichent une progression en temps réel :
```
đ DĂ©but du tĂ©lĂ©versement: 1 fichier(s) vers 3 serveur(s)
đ Destination: /opt/uploads/
đŻ Serveurs ciblĂ©s:
âą Production:Region-A:Public:WEB_SERVER_01 â web01@prod-web-01.example.com (PROD)
âą Production:Region-A:Public:API_SERVER_01 â api01@prod-api-01.example.com (PROD)
âą Production:Region-A:Private:DATABASE_01 â db01@prod-db-01.example.com (PROD)
đ€ TĂ©lĂ©versement de ./myapp.jar en cours...
web01@prod-web-01... [ââââââââââââââââââââââââââââââââ] 2.3MB/2.3MB â
api01@prod-api-01... [ââââââââââââââââââ ] 1.5MB/2.3MB âł
db01@prod-db-01..... [ââââââââââââââââââââââââââââ ] 2.1MB/2.3MB âł
â
Téléversement terminé avec succÚs!
đ 3 serveur(s) - 0 Ă©chec(s)
```
## đ Gestion des clĂ©s SSH
### Découverte automatique
xsshend détecte automatiquement les clés SSH disponibles dans `~/.ssh/` :
- **Types supportés** : Ed25519, RSA, ECDSA, DSA
- **Gestion des passphrases** avec ssh-agent
- **Sélection automatique** de la meilleure clé disponible
### Priorité de sélection
1. **Ed25519** - Recommandé pour la sécurité et performance
2. **RSA** - Compatibilité étendue
3. **ECDSA** - Alternative moderne
4. **DSA** - Support basique
### Configuration SSH
```bash
# Vérifier les clés disponibles
ssh-add -l
# Ajouter une clé à l'agent SSH
ssh-add ~/.ssh/id_ed25519
# Copier une clé publique vers un serveur
ssh-copy-id user@server.example.com
```
## âïž Configuration
### Structure hiérarchique
La configuration suit une structure Ă trois niveaux :
```
Environment/
âââ Region/
â âââ Type/
â â âââ SERVER_NAME_1
â â âââ SERVER_NAME_2
â âââ Type/
âââ Region/
```
**Exemple d'organisation :**
```
Production/
âââ Region-A/
â âââ Public/ # Serveurs web publics
â âââ Private/ # Bases de donnĂ©es internes
âââ Region-B/
âââ Public/
âââ Private/
Staging/
âââ Region-A/
â âââ Public/
âââ Region-B/
Development/
âââ Local/
âââ Services/
```
### Commande init
La commande `xsshend init` vous guide dans la configuration :
1. **Détection des clés SSH** existantes
2. **Création du fichier hosts.json** avec template
3. **Configuration des permissions** sécurisées (.ssh/ en 700)
4. **Conseils d'utilisation** personnalisés
```bash
# Configuration initiale interactive
xsshend init
# Réinitialisation complÚte
xsshend init --force
```
### Format des entrées serveur
Chaque serveur est défini avec :
```json
{
"SERVER_NAME": {
"alias": "username@hostname.example.com", // Obligatoire
"env": "ENVIRONMENT_TAG" // Optionnel
}
}
```
## đ ïž DĂ©veloppement
### Prérequis
- **Rust 2021 Edition** ou plus récent
- **OpenSSH** pour les clés SSH
- **Git** pour le développement
### Installation développement
```bash
# Cloner le projet
git clone https://github.com/willisback/xsshend.git
cd xsshend
# Installer les outils de développement
rustup component add clippy rustfmt
# Compiler en mode debug
cargo build
# Compiler en mode release
cargo build --release
```
### Tests
Le projet inclut une suite de tests complĂšte avec **93 tests** :
```bash
# Tests unitaires et d'intégration
cargo test
# Tests avec sortie détaillée
cargo test -- --nocapture
# Tests de performance (benchmarks)
cargo bench
```
### Qualité de code
```bash
# Formatage automatique
cargo fmt
# Linting avec Clippy
cargo clippy -- -D warnings
# Vérification complÚte
cargo check --all-targets --all-features
# Documentation
cargo doc --open
```
## đ§Ș Architecture de tests
### Couverture de tests
- **Unit tests** : 6 tests (modules core)
- **Config tests** : 14 tests (configuration JSON)
- **SSH keys tests** : 10 tests (gestion des clés)
- **Uploader tests** : 14 tests (téléversements)
- **CLI tests** : 21 tests (interface ligne de commande)
- **Integration tests** : 12 tests (workflows complets)
- **Validator tests** : 16 tests (validation fichiers)
### Tests d'intégration
Les tests d'intégration valident :
- â
Initialisation et configuration
- â
Détection et sélection des clés SSH
- â
Parsing et filtrage des configurations
- â
Workflows complets (init â list â upload)
- â
Gestion des erreurs et cas limites
- â
Performance avec grandes configurations
- â
Interface CLI et validation des arguments
## đ§ Stack technologique
### Dépendances principales
- **`ssh2`** - Client SSH/SFTP robuste
- **`clap`** - Interface ligne de commande moderne
- **`serde/serde_json`** - Sérialisation JSON
- **`indicatif`** - Barres de progression
- **`anyhow`** - Gestion d'erreurs ergonomique
- **`tempfile`** - Fichiers temporaires (tests)
### Architecture modulaire
```
src/
âââ main.rs # Point d'entrĂ©e CLI
âââ lib.rs # Interface bibliothĂšque
âââ config/ # Configuration hosts.json
â âââ mod.rs
â âââ hosts.rs
âââ ssh/ # Client SSH et clĂ©s
â âââ mod.rs
â âââ client.rs
â âââ keys.rs
âââ core/ # Logique mĂ©tier
â âââ mod.rs
â âââ uploader.rs
â âââ validator.rs
âââ utils/ # Utilitaires
âââ mod.rs
âââ logger.rs
tests/ # Tests d'intégration
âââ cli_test.rs
âââ config_test.rs
âââ integration_test.rs
âââ ssh_keys_test.rs
âââ uploader_test.rs
âââ validator_test.rs
âââ common/
âââ mod.rs # Utilitaires de test
benches/ # Tests de performance
âââ performance_bench.rs
```
## đĄïž DĂ©pannage
### ProblĂšmes courants
#### Erreur: "Permission denied (publickey)"
```bash
# Vérifier la configuration SSH
ssh -v user@server.example.com
# Vérifier l'agent SSH
ssh-add -l
# Ajouter une clé si nécessaire
ssh-add ~/.ssh/id_ed25519
```
#### Erreur: "hosts.json not found"
```bash
# Utiliser la commande d'initialisation
xsshend init
# Ou créer manuellement
mkdir -p ~/.ssh
nano ~/.ssh/hosts.json
```
#### Tests en échec
```bash
# Exécuter les tests avec détails
cargo test -- --nocapture
# Vérifier un test specific
cargo test test_name
# Tests d'intégration uniquement
cargo test --test integration_test
```
### Mode debug
```bash
# Logs détaillés
RUST_LOG=debug xsshend upload file.txt --env Production
# Mode trĂšs verbeux
RUST_LOG=trace xsshend upload file.txt --env Production
```
## đ€ Contribution
Les contributions sont les bienvenues !
### Processus de contribution
1. **Fork** le projet
2. Créer une **branche feature** (`git checkout -b feature/ma-fonctionnalite`)
3. **Commiter** les changements (`git commit -am 'Ajoute ma fonctionnalité'`)
4. **Pousser** vers la branche (`git push origin feature/ma-fonctionnalite`)
5. Ouvrir une **Pull Request**
### Standards de qualité
Avant de soumettre une PR, assurez-vous que :
- â
Code formaté : `cargo fmt`
- â
Linting OK : `cargo clippy -- -D warnings`
- â
Tests passants : `cargo test`
- â
Documentation Ă jour
Le workflow GitHub Actions vérifie automatiquement ces critÚres.
## đ Licence
Ce projet est sous licence **MIT** - voir le fichier [LICENSE](LICENSE) pour les détails.
## đ§Ș Environnement de Test (Lab)
Un environnement de test Docker complet est disponible pour valider xsshend en conditions réelles :
**Documentation du Lab :**
- **[Index du Lab](docs/LAB-INDEX.md)** - Point d'entrée principal
- **[Guide de Démarrage](docs/LAB-README.md)** - Installation et configuration
- **[Guide de Test](docs/LAB-TESTING-GUIDE.md)** - Tests détaillés (40+ tests)
- **[Dépannage](docs/LAB-TROUBLESHOOTING.md)** - Résolution de problÚmes
**Démarrage Rapide :**
```bash
# 1. Setup
git clone https://github.com/WillIsback/xsshend.git
cd xsshend
./scripts/lab-setup.sh
# 2. Démarrer le lab (3 conteneurs : master + 2 targets)
cd lab/
docker-compose up -d --build
# 3. Tests automatisés
../scripts/test-lab.sh
# 4. Tests manuels
docker exec -it xsshend_master bash
xsshend list
xsshend upload test.txt --env Test
```
Le lab fournit :
- â
Environnement ArchLinux isolé (Docker)
- â
3 conteneurs configurés (master + 2 targets SSH)
- â
Clés SSH pré-configurées (RSA + Ed25519)
- â
Suite de tests automatisés (40+ tests)
- â
Scripts de diagnostic et dépannage
- â
Documentation complĂšte
Voir **[docs/LAB-INDEX.md](docs/LAB-INDEX.md)** pour tous les détails.
## đ Remerciements
- **[clap-rs](https://github.com/clap-rs/clap)** pour l'excellent framework CLI
- **[russh](https://github.com/Eugeny/russh)** pour l'implémentation SSH pure Rust
- **[indicatif](https://github.com/console-rs/indicatif)** pour les barres de progression
- **[serde](https://github.com/serde-rs/serde)** pour la sérialisation JSON
- Communauté **Rust** pour l'écosystÚme exceptionnel
---
**xsshend** - *TĂ©lĂ©versement SSH simple et efficace* đ