Aide-mémoire SSH
Connexion de Base
ObjectifCommande
Connexion simple ssh user@hostname
ssh user@192.168.1.10
ssh user@monserveur.com
Port personnalisé ssh -p 2222 user@hostname
Avec une clé privée spécifique ssh -i ~/.ssh/ma_cle_privee user@hostname
Exécuter une commande distante ssh user@hostname "commande"
ssh user@hostname "ls -la /var/www"
ssh user@hostname "sudo systemctl restart apache2"
Exécuter un script local à distance ssh user@hostname 'bash -s' < script_local.sh
cat script.sh | ssh user@hostname bash
Mode verbose (debug) ssh -v user@hostname   -- verbose
ssh -vv user@hostname  -- très verbose
ssh -vvv user@hostname -- debug maximal
Sortir d'une session gelée ~.  -- séquence d'échappement pour fermer (taper ~ puis .)
~?  -- aide sur les séquences d'échappement
Génération et Gestion des Clés
Générer une clé ED25519 (recommandé) ssh-keygen -t ed25519 -C "commentaire@exemple.com"
ssh-keygen -t ed25519 -C "serveur-prod" -f ~/.ssh/id_prod

-- Fichiers générés :
~/.ssh/id_ed25519     # clé PRIVÉE (garder secrète !)
~/.ssh/id_ed25519.pub # clé PUBLIQUE (à copier sur les serveurs)
Générer une clé RSA (plus compatible) ssh-keygen -t rsa -b 4096 -C "commentaire"
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_monserveur
Copier la clé publique sur un serveur # Méthode automatique (recommandée)
ssh-copy-id user@hostname
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
ssh-copy-id -p 2222 -i ~/.ssh/id_prod.pub user@hostname

# Méthode manuelle
cat ~/.ssh/id_ed25519.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# Sur le serveur distant
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Lister les clés enregistrées ls -la ~/.ssh/
cat ~/.ssh/authorized_keys  # clés autorisées (serveur)
cat ~/.ssh/known_hosts      # serveurs connus (client)
Afficher l'empreinte d'une clé ssh-keygen -lf ~/.ssh/id_ed25519.pub
ssh-keygen -lf ~/.ssh/id_ed25519.pub -E md5
Changer la passphrase d'une clé ssh-keygen -p -f ~/.ssh/id_ed25519
Supprimer un serveur de known_hosts ssh-keygen -R hostname
ssh-keygen -R 192.168.1.10
Droits obligatoires chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519        # clé privée
chmod 644 ~/.ssh/id_ed25519.pub    # clé publique
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/config
Fichier ~/.ssh/config
Exemple de configuration complète nano ~/.ssh/config # Serveur de production Host prod HostName monserveur.com User deployer Port 22 IdentityFile ~/.ssh/id_prod ForwardAgent yes # Serveur de dev Host dev HostName 192.168.1.50 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60 ServerAliveCountMax 3 # Bastion (jump host) Host bastion HostName bastion.exemple.com User admin IdentityFile ~/.ssh/id_bastion # Serveur interne via bastion Host interne HostName 192.168.10.20 User admin ProxyJump bastion # Paramètres globaux Host * ServerAliveInterval 60 AddKeysToAgent yes IdentityFile ~/.ssh/id_ed25519
Utilisation du fichier config ssh prod                -- connexion au serveur "prod"
ssh dev                 -- connexion au serveur "dev"
scp fichier prod:/tmp/  -- transfert vers prod
rsync -avz src/ prod:/dest/
Options config utiles HostName              -- IP ou nom DNS réel
User                  -- nom d'utilisateur
Port                  -- port SSH (défaut 22)
IdentityFile          -- clé privée à utiliser
ForwardAgent          -- transmettre l'agent SSH
ServerAliveInterval   -- keepalive en secondes
ServerAliveCountMax   -- nb de keepalives avant déconnexion
ProxyJump             -- rebondir via un autre hôte (bastion)
StrictHostKeyChecking no -- ne pas vérifier la clé (dev uniquement !)
Compression yes       -- activer la compression
Transfert de Fichiers
SCP (Secure Copy) # Envoyer un fichier vers le serveur
scp fichier.txt user@hostname:/chemin/distant/
scp -P 2222 fichier.txt user@hostname:/tmp/

# Envoyer un dossier entier
scp -r dossier/ user@hostname:/var/www/

# Récupérer un fichier depuis le serveur
scp user@hostname:/var/log/apache2/error.log ./error.log

# Récupérer un dossier
scp -r user@hostname:/var/www/ ./backup/

# Entre deux serveurs distants
scp user1@serveur1:/fichier user2@serveur2:/destination/
SFTP (interactif) sftp user@hostname
sftp -P 2222 user@hostname

# Commandes dans la session SFTP :
ls / lls        -- liste distante / locale
cd / lcd        -- changer de dossier distant / local
pwd / lpwd      -- dossier courant distant / local
get fichier.txt -- télécharger
put fichier.txt -- envoyer
mget *.log      -- télécharger plusieurs fichiers
mput *.php      -- envoyer plusieurs fichiers
mkdir / rmdir   -- créer / supprimer dossier
rm fichier.txt  -- supprimer
quit / bye      -- quitter
RSYNC (synchronisation) # Options courantes : -a archive -v verbose -z compresse -P progression # --delete : supprime les fichiers absents de la source # Synchroniser un dossier local → serveur rsync -avzP ./www/ user@hostname:/var/www/html/ rsync -avz --delete ./www/ user@hostname:/var/www/html/ # Récupérer depuis le serveur rsync -avzP user@hostname:/var/www/ ./backup/ # Port SSH personnalisé rsync -avz -e "ssh -p 2222" ./www/ user@hostname:/var/www/ # Simulation (dry-run) rsync -avz --dry-run ./www/ user@hostname:/var/www/ # Exclure des fichiers/dossiers rsync -avz --exclude='*.log' --exclude='node_modules/' ./www/ user@hostname:/var/www/ # Limiter la bande passante (en Ko/s) rsync -avz --bwlimit=1000 ./www/ user@hostname:/var/www/
Tunnels SSH (Port Forwarding)
Tunnel local (L) # Accéder à un port distant via un port local # ssh -L port_local:hote_cible:port_cible user@bastion # Accéder à une BDD MySQL distante (port 3306) via localhost:3307 ssh -L 3307:localhost:3306 user@serveur-bdd -N # Accéder à un serveur web interne via un bastion ssh -L 8080:serveur-interne:80 user@bastion -N # Options : # -N : ne pas exécuter de commande (tunnel seul) # -f : passer en arrière-plan # -C : activer la compression ssh -f -N -L 3307:localhost:3306 user@serveur-bdd
Tunnel distant (R) # Exposer un port local sur le serveur distant # ssh -R port_distant:hote_local:port_local user@serveur # Exposer localhost:80 sur le port 8080 du serveur distant ssh -R 8080:localhost:80 user@serveur -N # Cas d'usage : partager son dev local avec quelqu'un ayant accès au serveur
Proxy SOCKS dynamique (D) # Créer un proxy SOCKS5 via le serveur SSH ssh -D 1080 user@hostname -N -f # Configurer le navigateur ou le système sur 127.0.0.1:1080 (SOCKS5) # Tout le trafic passe alors par le serveur SSH # curl via le proxy curl --socks5 127.0.0.1:1080 http://exemple.interne/
ProxyJump / Jump Host # Se connecter à un serveur interne via un bastion ssh -J user@bastion user@serveur-interne ssh -J user@bastion:2222 admin@192.168.10.5 # Avec le fichier config (recommandé) : # Host interne # ProxyJump bastion ssh interne
Maintenir un tunnel en arrière-plan # Avec autossh (reconnexion automatique) autossh -M 0 -f -N -L 3307:localhost:3306 user@serveur # Installer autossh sudo apt install autossh
SSH Agent
Démarrer et utiliser l'agent # Démarrer l'agent (si pas déjà actif) eval $(ssh-agent -s) # Ajouter une clé à l'agent (mémorise la passphrase) ssh-add ~/.ssh/id_ed25519 ssh-add ~/.ssh/id_prod # Lister les clés chargées ssh-add -l # Supprimer toutes les clés de l'agent ssh-add -D # Supprimer une clé spécifique ssh-add -d ~/.ssh/id_ed25519 # Ajouter avec expiration (ex: 1h = 3600s) ssh-add -t 3600 ~/.ssh/id_ed25519
Agent Forwarding # Transmettre l'agent pour éviter de stocker des clés sur le serveur ssh -A user@bastion # Ou dans ~/.ssh/config : # ForwardAgent yes # Depuis le bastion, connexion à un serveur interne sans clé locale ssh user@serveur-interne  # utilise les clés de votre agent local
Sous Windows (Keychain / PowerShell) # PowerShell - activer l'agent OpenSSH Get-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent ssh-add $env:USERPROFILE\.ssh\id_ed25519
Sécurisation du Serveur SSH (sshd)
Fichier de configuration serveur sudo nano /etc/ssh/sshd_config # Principale configuration de sécurité recommandée : Port 2222                        # Changer le port par défaut ListenAddress 0.0.0.0 # Authentification PermitRootLogin no              # Interdire root PasswordAuthentication no       # Clés uniquement (recommandé !) PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PermitEmptyPasswords no MaxAuthTries 3 LoginGraceTime 30 # Restrictions AllowUsers deployer admin       # Seuls ces users peuvent se connecter # AllowGroups sshusers # Sécurité des algorithmes Protocol 2 Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com MACs hmac-sha2-512,hmac-sha2-256 KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256 # Keepalive et timeouts ClientAliveInterval 300 ClientAliveCountMax 2 # Divers X11Forwarding no PrintLastLog yes Banner /etc/issue.net
Redémarrer sshd après modif # Tester la config avant de redémarrer ! sudo sshd -t sudo systemctl reload ssh sudo systemctl restart ssh sudo systemctl status ssh
Fail2ban (protection brute-force) sudo apt install fail2ban # Config /etc/fail2ban/jail.local [sshd] enabled = true port = 2222 maxretry = 5 bantime = 3600 findtime = 600 sudo systemctl enable fail2ban sudo systemctl start fail2ban sudo fail2ban-client status sshd sudo fail2ban-client set sshd unbanip 1.2.3.4
Astuces et Commandes Avancées
Multiplexage de connexions # Réutiliser une connexion existante (plus rapide) # Dans ~/.ssh/config : Host * ControlMaster auto ControlPath ~/.ssh/control/%r@%h:%p ControlPersist 10m mkdir -p ~/.ssh/control
Session tmux persistante # Lancer ou rattacher une session tmux ssh user@serveur "tmux new -As masession" # Dans tmux : Ctrl+B D pour détacher # Plus tard : ssh user@serveur "tmux attach -t masession"
Copier un fichier via SSH pipe # Copier un fichier sans SCP (pratique avec des hôtes relais) ssh user@source "cat /var/log/app.log" > ./app.log # Copier entre deux serveurs (via votre machine) ssh user@source "cat /chemin/fichier" | ssh user@dest "cat > /chemin/fichier"
Montage SSHFS (système de fichiers SSH) sudo apt install sshfs # Monter un répertoire distant mkdir -p /mnt/monserveur sshfs user@hostname:/var/www /mnt/monserveur sshfs -p 2222 user@hostname:/home/user /mnt/monserveur # Démonter fusermount -u /mnt/monserveur sudo umount /mnt/monserveur
Tester la latence SSH time ssh user@hostname exit
Lister les connexions actives who                       # sur le serveur
w                        # avec les commandes en cours
last                      # historique des connexions
ss -tnp | grep :22        # connexions TCP sur le port 22
Générer un fingerprint connu ssh-keyscan hostname 2>/dev/null | ssh-keygen -lf - ssh-keyscan -H hostname >> ~/.ssh/known_hosts