Aller au contenu

SSH : configuration du client

Le fichier ~/.ssh/config évite de retaper utilisateur, port et clé à chaque connexion. Les exemples utilisent des noms génériques.

Host monserveur
HostName serveur.exemple.com
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes

Ensuite : ssh monserveur, scp fichier monserveur:/tmp/, rsync -az dossier/ monserveur:/srv/site/. Les droits du fichier doivent être restreints :

Fenêtre de terminal
chmod 600 ~/.ssh/config
Directive Rôle
Host Alias (ou motif avec * et ?)
HostName Nom ou adresse réels
User, Port Compte et port
IdentityFile Clé privée à utiliser
IdentitiesOnly yes N’essayer que la clé indiquée (évite Too many authentication failures)

Les blocs sont lus dans l’ordre et, pour chaque directive, la première valeur rencontrée l’emporte : placer les blocs spécifiques avant Host *.

Host monserveur
HostName serveur.exemple.com
User deploy
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
HashKnownHosts yes
Directive Rôle
ServerAliveInterval 60 Envoie un signal toutes les 60 s : évite les déconnexions par inactivité
ServerAliveCountMax 3 Ferme la connexion après 3 signaux sans réponse
AddKeysToAgent yes Charge la clé dans l’agent à la première utilisation
HashKnownHosts yes Masque les noms des serveurs dans known_hosts
Host git-travail
HostName git.exemple.com
User git
IdentityFile ~/.ssh/id_travail
IdentitiesOnly yes
Host git-perso
HostName git.exemple.com
User git
IdentityFile ~/.ssh/id_perso
IdentitiesOnly yes

Le dépôt se clone alors avec l’alias : git clone git@git-perso:equipe/projet.git.

Host interne
HostName 10.0.0.20
User deploy
ProxyJump monserveur

ssh interne passe par monserveur automatiquement. En ligne de commande : ssh -J monserveur deploy@10.0.0.20. Voir Tunnels et rebonds.

Multiplexage : une seule connexion pour plusieurs sessions

Section intitulée « Multiplexage : une seule connexion pour plusieurs sessions »
Host *
ControlMaster auto
ControlPath ~/.ssh/cm-%C
ControlPersist 10m

La première connexion reste ouverte 10 minutes ; les suivantes (ssh, scp, rsync) la réutilisent instantanément, sans nouvelle authentification.

Fenêtre de terminal
ssh -O check monserveur # la connexion maîtresse existe-t-elle ?
ssh -O exit monserveur # la ferme
ssh -O stop monserveur # n'accepte plus de nouvelles sessions
Include ~/.ssh/config.d/*.conf
Host monserveur
HostName serveur.exemple.com

Include permet de ranger la configuration par projet. Le fichier d’inclusion doit être placé avant les blocs Host qui doivent le suivre (ou tout en haut du fichier).

Fenêtre de terminal
ssh -G monserveur # toutes les valeurs effectives
ssh -G monserveur | grep -E "^(hostname|user|port|identityfile) "
ssh -v monserveur # connexion détaillée
Fenêtre de terminal
ssh-keyscan -t ed25519 serveur.exemple.com # clé publique présentée par le serveur
ssh-keygen -F serveur.exemple.com # entrée connue pour ce serveur
ssh-keygen -R serveur.exemple.com # supprime l'entrée (après un changement légitime de clé)

Réglage de la vérification (StrictHostKeyChecking) :

Valeur Comportement
ask (défaut) Demande confirmation pour un nouveau serveur
accept-new Accepte les nouveaux serveurs, refuse un changement de clé
yes Refuse tout serveur inconnu
no Accepte tout : à éviter (aucune protection contre l’usurpation)
Fenêtre de terminal
ssh -o ConnectTimeout=5 -o BatchMode=yes monserveur true # test sans interaction (scripts)
ssh -t monserveur sudo systemctl status ssh # force un terminal (commande interactive)
ssh -A monserveur # transmet l'agent (prudence)
ssh -X monserveur # affichage graphique distant (X11)
ssh -N -f monserveur # connexion en arrière-plan, sans commande
Symptôme Piste
Le bloc Host n’est pas pris en compte ssh -G alias : une valeur d’un bloc précédent l’emporte (première valeur rencontrée)
Bad owner or permissions on ~/.ssh/config chmod 600 ~/.ssh/config
Too many authentication failures Ajouter IdentitiesOnly yes et IdentityFile
La connexion multiplexée garde d’anciens réglages ssh -O exit alias puis reconnecter
ssh: Could not resolve hostname HostName incorrect, DNS ou typographie de l’alias