web-dev-qa-db-fra.com

Pouvez-vous avoir plus d'un fichier ~ / .ssh / config?

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.

86
wrangler

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.
58
Jeff Ferland

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.

57
rush

À 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 directive Include peut apparaître à l'intérieur d'un bloc Match ou Host 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 )

37
Christian Hudon

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.

17
Szymon Jeż

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.

2
ThorstenS

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)

0
knope

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.

0
blueyed