Comment importer sa config SSH dans un gestionnaire de config SSH

Listez les vrais hôtes de ~/.ssh/config et de chaque fichier cité par Include, puis lancez ssh -G nom pour chacun afin de voir l'adresse, le port, l'utilisateur, la clé et le serveur de rebond que ssh utilise vraiment. C'est cette vue résolue qu'un import doit reproduire. Sauvegardez d'abord le fichier, les clés et known_hosts, et passez par un CSV quand les serveurs vivent dans un tableur.

Mis à jour le . Exécuté sur macOS 27 avec OpenSSH 10.3 sur une config de test avec Include, ProxyJump, LocalForward et Host * : la liste des hôtes avec awk, ssh -G pour chaque hôte et la boucle CSV ont été lancés, et leur sortie est montrée avec des adresses d'exemple.

Ce que contient un fichier de config

Avant de déplacer une config, sachez ce que veut dire chaque partie, car une partie seulement décrit des serveurs :

Include config.d/*

Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519_work
  ProxyJump bastion
  LocalForward 5433 localhost:5432

Host *
  ServerAliveInterval 60
  • Host web est un serveur : un nom que vous tapez, avec son adresse et ses réglages.
  • Host * et les autres motifs comme *.example.com ne sont pas des serveurs. Ils ajoutent des valeurs par défaut à chaque hôte qui correspond.
  • Include charge d'autres fichiers, ici ~/.ssh/config.d/*, comme s'ils étaient collés à cet endroit.
  • ProxyJump et les lignes Forward relient les serveurs entre eux et aux tunnels.

Pour chaque option, ssh garde la première valeur lue, parmi tous les blocs correspondants. Le guide du fichier de config SSH explique cette règle avec des exemples.

Lister chaque hôte, fichiers Include compris

Un rapide grep Host rate les fichiers inclus et mélange serveurs et motifs. Ceci ne liste que les vrais noms, depuis le fichier principal et les fichiers inclus :

awk 'tolower($1)=="host" { for (i = 2; i <= NF; i++) if ($i !~ /[*?!]/) print $i }' ~/.ssh/config ~/.ssh/config.d/*
web
bastion

Adaptez le second chemin à vos propres lignes Include, ou retirez-le si vous n'en avez pas. Un nom qui apparaît deux fois est défini à deux endroits, et seules les valeurs du premier bloc l'emportent pour chaque option.

Vérifier chaque hôte avec ssh -G

ssh -G affiche les réglages finaux d'un hôte, avec tous les fichiers et motifs appliqués, sans se connecter. C'est la vérité qu'un import doit respecter :

ssh -G web | grep -E '^(hostname|user|port|identityfile|proxyjump|localforward|remoteforward|dynamicforward) '
user deploy
hostname 203.0.113.10
port 2222
localforward 5433 [localhost]:5432
identityfile ~/.ssh/id_ed25519_work
proxyjump bastion

Cherchez les surprises : un user venu de Host *, un chemin de clé qui n'existe pas, ou un serveur de rebond absent de votre liste. Pour vérifier que chaque fichier de clé est bien là :

ls -l ~/.ssh/id_ed25519_work ~/.ssh/id_ed25519_work.pub

Les serveurs de rebond ont leur propre guide, exemples de ProxyJump et de serveur de rebond, et les redirections sont expliquées dans tunnels SSH : local, distant et dynamique.

Sauvegarder, puis exporter en CSV si besoin

Gardez une copie de tout ce qu'un import lit, pour comparer ensuite et revenir en arrière si nécessaire :

mkdir -p ~/ssh-backup
cp -p ~/.ssh/config ~/.ssh/known_hosts ~/ssh-backup/
cp -rp ~/.ssh/config.d ~/ssh-backup/

Certains outils, et certaines équipes, travaillent à partir d'un tableur. Cette boucle transforme chaque hôte en une ligne CSV avec les valeurs que ssh utilise vraiment, selon une disposition courante où les colonnes groupes, tags et mots de passe restent vides :

{
  echo 'Groups,Label,Tags,Hostname/IP,Protocol,Port,Username,Password'
  for h in $(awk 'tolower($1)=="host" { for (i = 2; i <= NF; i++) if ($i !~ /[*?!]/) print $i }' ~/.ssh/config ~/.ssh/config.d/*); do
    ssh -G "$h" | awk -v h="$h" '$1=="hostname"{n=$2} $1=="port"{p=$2} $1=="user"{u=$2} END{print ","h",,"n",ssh,"p","u","}'
  done
} > hosts.csv
Groups,Label,Tags,Hostname/IP,Protocol,Port,Username,Password
,web,,203.0.113.10,ssh,2222,deploy,
,bastion,,198.51.100.5,ssh,22,admin,

Adaptez les chemins de la boucle comme pour la liste des hôtes. Remplissez des groupes comme Acme et des tags comme prod dans un tableur avant l'import. Supprimez le fichier à la fin si vous y avez ajouté des mots de passe.

Emporter known_hosts

Votre known_hosts contient les empreintes que vous avez déjà acceptées. L'importer évite que la première connexion depuis le nouvel outil vous demande à nouveau de faire confiance à chaque serveur. Pour vérifier qu'un hôte y figure :

ssh-keygen -F 203.0.113.10
ssh-keygen -F '[203.0.113.10]:2222'

Un hôte sur un autre port que 22 est enregistré entre crochets avec le port, comme à la deuxième ligne. Si HashKnownHosts est activé, les noms sont hachés et seule une recherche comme celle-ci les retrouve. Plus de détails dans known_hosts expliqué.

Après l'import

  • Comparez quelques serveurs avec la sortie de ssh -G : adresse, port, utilisateur, clé et serveur de rebond.
  • Connectez-vous à un serveur de chaque type : un direct, un derrière un serveur de rebond, un avec un tunnel.
  • Gardez le fichier d'origine pour scp, rsync et git, qui continuent à le lire. L'import copie les réglages, il ne modifie pas ~/.ssh/config.
  • Rangez le résultat en groupes et tags, comme dans comment gérer de nombreux serveurs SSH.

Les étapes dans l'application sont dans la documentation sur l'import des hôtes.

Questions

Qu'est-ce qu'un gestionnaire de config SSH ?

Une application qui stocke les mêmes informations que ~/.ssh/config, comme adresses, utilisateurs, ports, clés, serveurs de rebond et tunnels, sous forme de serveurs enregistrés que vous modifiez dans un formulaire et rangez en groupes, au lieu de blocs dans un fichier texte.

Les fichiers Include sont-ils importés avec ~/.ssh/config ?

Ils devraient l'être, car ssh les lit comme une partie du fichier. Avant d'importer, vérifiez que ssh -G montre les réglages venant des fichiers inclus, pour savoir à quoi vous attendre.

Les valeurs de Host * s'appliquent-elles aux serveurs importés ?

Dans ssh, tous les blocs correspondants s'appliquent et la première valeur l'emporte, donc un serveur reçoit les valeurs de Host * qu'il n'a pas définies lui-même. ssh -G montre ce résultat final pour chaque hôte.

Peut-on importer des hôtes SSH depuis un fichier CSV ?

Oui, si le gestionnaire lit le CSV. Une disposition courante est Groups, Label, Tags, Hostname/IP, Protocol, Port, Username et Password, un serveur par ligne.

Sources

Autres guides : Configuration et nombreux serveurs

Tous les guides