Nous avons un serveur bastion que nous utilisons pour nous connecter à plusieurs hôtes, et notre .ssh/config est passé à plus de mille lignes (nous avons des centaines d'hôtes auxquels nous nous connectons). Cela commence à devenir un peu lourd et j'aimerais savoir s'il existe un moyen de diviser le fichier .ssh/config en plusieurs fichiers. Idéalement, nous spécifierions quelque part que les autres fichiers seraient traités comme un fichier .ssh/config, éventuellement comme:
~/.ssh/config
~/.ssh/config_1
~/.ssh/config_2
~/.ssh/config_3
...
J'ai lu la documentation sur ssh/config, et je ne vois pas que c'est possible. Mais peut-être que quelqu'un d'autre a eu un problème similaire et a trouvé une solution.
Le ~/.ssh/config
le fichier n'a pas de directive pour inclure d'autres fichiers, probablement liés à la vérification par SSH des autorisations de fichier.
Les suggestions à ce sujet peuvent inclure un script pour effectuer plusieurs modifications ensemble sur le système ou via des hooks de consignation sur un référentiel. On pourrait également examiner des outils tels que Puppet ou Augeas.
Cependant, quelle que soit votre approche, vous devrez concaténer des fichiers individuels pour en faire un seul fichier extérieur au fichier.
$ cat ~/.ssh/config_* >> ~/.ssh/config
note: écraser: >
v.s. ajouter: >>
Mise à jour décembre 2017:
À partir de 7.3p1 et plus, il y a l'option Inclure. Ce qui vous permet d'inclure des fichiers de configuration.
Include
Include the specified configuration file(s). Mul‐
tiple pathnames may be specified and each pathname
may contain glob(3) wildcards and, for user config‐
urations, Shell-like “~” references to user home
directories. Files without absolute paths are
assumed to be in ~/.ssh if included in a user con‐
figuration file or /etc/ssh if included from the
system configuration file. Include directive may
appear inside a Match or Host block to perform con‐
ditional inclusion.
Vous pouvez spécifier le fichier de configuration actuel à utiliser dans l'option ssh comme ceci:
ssh -F /path/to/configfile
Semble que c'est la seule façon.
Il est également impossible d'inclure une configuration dans une autre.
À partir de ssh 7.3 (publié le 1er août 2016), une directive Include
est disponible.
Inclure : inclut le ou les fichiers de configuration spécifiés. Plusieurs noms de chemin peuvent être spécifiés et chaque nom de chemin peut contenir des caractères génériques glob et des références "~" de type Shell aux répertoires personnels des utilisateurs. Les fichiers sans chemins absolus sont supposés être dans
~/.ssh
. Une directiveInclude
peut apparaître à l'intérieur d'un blocMatch
ouHost
pour effectuer une inclusion conditionnelle.
(Voici le lien vers le rapport de bogue résolu, qui inclut également le correctif: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )
J'utilise personnellement ces commandes pour compiler la configuration ssh:
alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)
ou:
alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)
parce que:
alias ssh='ssh -F <(cat .ssh/*.config)'
ne fonctionne pas pour moi, retournant:
ssh: Can't open user config file /dev/fd/63: Bad file descriptor
J'espère que cela vous sera utile.
J'utiliserais également cat config_* > config
pour générer toute la configuration. Mais je n'utiliserais pas puppet/cfengine etc pour cela, s'ils ne sont pas encore en place (BTW: pourquoi ne pas utiliser un système de gestion de configuration ???).
Je générerais un paquet (deb, rpm) et le mettrais dans un dépôt local. Et dans le script postinst, le chat génère votre configuration. Peut-être que vous incluez également un dossier local ... L'avantage est que les mises à jour ssh/config s'activent quotidiennement pendant que cron-apt & Co s'exécute.
J'ai joué avec le concept d'un config.d
répertoire pour l'organisation de ma config. Donc, pour ajouter à la pile d'options ci-dessus, voici ce qui a fonctionné pour moi.
La structure du répertoire est quelque chose comme
~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish
La fonction qui construit le ~/.ssh/config et réside dans run-config de mon shell est la suivante
sshMakeConfig() {
echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
for i in ~/.ssh/config.d/*
do echo "#${i}" | tee -a ~/.ssh/config
cat ${i} >> ~/.ssh/config
done
}
Ajoutez éventuellement sshMakeConfig
au bas de votre run-config si vous voulez assurer une nouvelle configuration sur chaque session Shell
Chaque fois que j'ai besoin de recompiler mon ~/.ssh/config, je le fais en exécutant sshMakeConfig
sous une forme (directement, en recherchant ma run-config ou en démarrant un nouveau Shell)
Vous pouvez utiliser un Makefile dans ~/.ssh
:
config: config.in config.app.in
> $@
(for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@
config.app.in:
(echo "# Generated with foobar.sh."; \
foobar.sh) > $@
.PHONY: config.app.in
Déplacez ensuite votre config
existant vers config.in
et exécutez make
pour générer config
.