Un exemple qui fonctionne
Include ~/.ssh/config.d/*
Host web
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Host *.example.com
User admin
Host *
ServerAliveInterval 60
User user
Désormais, ssh web équivaut à ssh -p 2222 -i ~/.ssh/id_ed25519_work deploy@203.0.113.10, et envoie aussi un keepalive toutes les 60 secondes. Les mêmes noms fonctionnent pour scp, sftp et rsync.
Le fichier est ~/.ssh/config. Il ne doit pas être modifiable par d'autres, sinon ssh s'arrête avec Bad owner or permissions. Lancez chmod 600 ~/.ssh/config. Les réglages à l'échelle du système sont lus après lui, depuis /etc/ssh/ssh_config.
Avec des dizaines d'hôtes, le fichier ne suffit pas. Voyez comment gérer de nombreux serveurs SSH pour garder noms, groupes et clés en ordre.
La première valeur l'emporte
C'est la règle qui surprend. Chaque bloc Host qui correspond s'applique, pas seulement le premier. Pour chaque option, ssh garde la première valeur lue et ignore les suivantes. Dans l'exemple :
ssh webobtientUser deploy, car son bloc vient avantHost *.ssh db.example.comobtientUser admin.ssh otherobtientUser user, et les trois obtiennentServerAliveInterval 60.
Placez donc les hôtes précis en haut et les valeurs par défaut à la fin. Si vous déplacez Host * en haut, son User l'emporte partout. Les options de la ligne de commande passent avant tout le reste : ssh -l other web, ssh other@web et ssh -p 3000 web écrasent donc le fichier.
Il y a une exception à connaître. IdentityFile s'additionne : une valeur dans Host web-* et une autre dans Host * sont toutes deux essayées, dans l'ordre. Ajoutez IdentitiesOnly yes si vous voulez éviter les clés de l'agent, et laissez IdentityFile hors de Host * si vous voulez une clé par hôte.
Motifs Host
| Motif | Correspond à |
|---|---|
Host web db | L'un ou l'autre nom. |
Host *.example.com | Tout nom se terminant par .example.com. |
Host web-? | web- suivi d'un caractère. |
Host web-* !web-old | Tous les noms en web- sauf web-old. Une négation seule ne correspond à rien : elle ne fait qu'exclure d'une correspondance positive. |
Le motif est comparé à ce que vous tapez, pas à l'adresse obtenue après résolution. %h représente ce nom, ce qui permet les noms courts :
Host web-*
HostName %h.example.com
ssh web-1 se connecte désormais à web-1.example.com.
Include
Include ~/.ssh/config.d/*
Cela lit d'autres fichiers comme s'ils étaient collés à cet endroit, ce qui permet de garder un fichier par projet. Les chemins relatifs partent de ~/.ssh. Il faut OpenSSH 7.3 ou plus récent.
Placez-le en haut du fichier. Un bloc Host se poursuit jusqu'au suivant, et un Include placé après lui fait partie de ce bloc. Nous l'avons testé : avec Include sous un bloc Host a, les réglages du fichier inclus n'ont rien fait pour aucun autre hôte. Vous pouvez l'utiliser exprès, pour n'inclure un fichier que pour certains hôtes.
Match
Match est une forme plus puissante de Host, avec des conditions :
Match host "*.internal" user deploy
Port 2200
Match exec "test -f /tmp/at-office"
ProxyJump bastion
Le premier ne s'applique que si les deux conditions sont vraies. Le second exécute une commande shell et s'applique si elle se termine avec 0, ce qui permet de changer les réglages selon le réseau ou le lieu. Notez que cette commande s'exécute à chaque lecture de la configuration, même avec ssh -G.
Les conditions utiles sont host, originalhost, user, localuser, exec, tagged, final et all. host vérifie le nom après application de HostName, et originalhost vérifie ce que vous avez tapé. final fait lire la configuration une seconde fois à ssh, ce qui permet à un bloc de voir le résultat de la première passe :
Host *.corp
HostName %h.example.com
Match final host *.example.com
User admin
Dans OpenSSH 9.4 et les versions suivantes, vous pouvez aussi étiqueter des hôtes et les sélectionner avec Match tagged ou ssh -P :
Host web
Tag prod
Match tagged prod
User deploy
ProxyJump a sa propre page : utiliser ProxyJump et un serveur de rebond en SSH.
Voir le résultat avec ssh -G
ssh -G web
Cela affiche chaque réglage que ssh utiliserait pour cet hôte, avec tous les fichiers et règles appliqués, puis se termine sans se connecter. C'est le moyen le plus rapide de répondre à « pourquoi utilise-t-il cet utilisateur ? » :
ssh -G web | grep -E '^(hostname|user|port|identityfile) '
Pour savoir si votre configuration est la cause d'un problème, ignorez-la le temps d'une commande. -F none saute à la fois le fichier de l'utilisateur et celui du système :
ssh -F none user@203.0.113.10
Pour la connexion elle-même, ssh -v web affiche quelles lignes de configuration ont été appliquées.
Erreurs courantes
- Un
Host *en haut qui écrase tout ce qui suit. - Une option globale à la fin du fichier. Les options hors d'un bloc doivent venir avant le premier
Host. À la fin, elles appartiennent au dernier bloc. - Une faute de frappe dans une option. ssh s'arrête avec
Bad configuration optionet ne se connecte à rien, sur aucun hôte. Pour une option que seules certaines versions connaissent, mettezIgnoreUnknownet le nom de l'option au-dessus. - Des secrets dans le fichier. Il contient des chemins vers des clés, pas des clés, et il n'a pas d'option de mot de passe. C'est ainsi qu'il doit rester.
Questions
Où se trouve le fichier de configuration SSH ?
Sous Linux et macOS, c'est ~/.ssh/config dans votre dossier personnel. Sous Windows, c'est C:\Users\nom\.ssh\config. Il n'existe pas tant que vous ne l'avez pas créé. Les réglages système de /etc/ssh/ssh_config sont lus après lui.
Pourquoi ssh ignore-t-il un réglage de ma config ?
Un autre bloc correspondant a défini la même option avant, et la première valeur l'emporte. Lancez ssh -G suivi du nom de l'hôte pour voir la valeur que ssh utilisera, et placez les hôtes précis au-dessus de Host *.
Le fichier de configuration SSH s'applique-t-il à scp, sftp et rsync ?
Oui. Ils passent par ssh pour se connecter, donc les noms d'hôtes et les options de ~/.ssh/config s'appliquent aussi, par exemple scp fichier.txt web:/tmp/.
Sources
- ssh_config(5), manuel OpenBSD
- ssh(1), manuel OpenBSD
- Notes de version d'OpenSSH 7.3, Include
- Notes de version d'OpenSSH 9.4, tags