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

82

Nous avons un serveur de bastion que nous utilisons pour nous connecter à plusieurs hôtes, et notre .ssh / config a dépassé les mille lignes (nous avons des centaines d’hôtes auxquels nous nous connectons). Cela commence à devenir un peu difficile à manier 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 d'autres fichiers seraient traités comme des fichiers .ssh / config, comme par exemple:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

J'ai lu la documentation sur ssh / config et je ne vois pas cela possible. Mais peut-être que quelqu'un d'autre a eu un problème similaire et a trouvé une solution.

cow-boy
la source
Demandez à chaque utilisateur de se connecter à l'hôte bastion avec son propre nom d'utilisateur. Aussi, que mettez-vous dans le fichier de configuration qui nécessite une entrée pour chaque hôte? Ne pouvez-vous pas définir des valeurs par défaut communes?
Jed Daniels
1
Même question sur superuser.com: superuser.com/questions/247564/…
guettli
1
Bientôt, cela devrait être possible dans OpenSSH 7.3. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Réponses:

51

Le ~/.ssh/configfichier n'a pas de directive pour l'inclusion d'autres fichiers, éventuellement liée à la vérification des autorisations de fichiers par SSH.

Les suggestions autour de cela peuvent inclure un script permettant de filtrer plusieurs modifications ensemble, soit sur le système, soit via des hooks d’archivage sur un référentiel. On pourrait aussi se pencher sur des outils tels que Puppet ou Augeas.

Cependant, quelle que soit l'approche adoptée, vous devrez concaténer des fichiers individuels pour constituer un fichier unique situé en dehors du fichier.

$ cat ~/.ssh/config_* >> ~/.ssh/config

note: écraser: > vs ajouter:>>

Mise à jour décembre 2017:

A partir de 7.3p1, 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.
Jeff Ferland
la source
Merci Jeff, c'est une bonne idée. Je ne sais pas trop à propos de Puppet ou d’Augeas. Par conséquent, afin de garder les choses aussi simples que possible, votre solution semble la meilleure. Je pourrais diviser la configuration en plusieurs configurations et créer un script simple pour recréer le fichier .ssh / config chaque fois que l'un des fichiers est modifié. Je ne sais pas à quel point cette solution est nette, mais elle semble faire l'affaire et fonctionne pour moi.
Wrangler
52

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 le seul moyen.

De plus, il est maintenant possible d'inclure une configuration dans une autre.

se ruer
la source
Une option intéressante lorsque vous utilisez le module Net :: OpenSSH de Perl (par exemple, pour plusieurs fichiers de clés privées), où le module ne donne pas toutes les possibilités.
Jimmy Koerting
36

À partir de ssh 7.3 (publié le 1er août 2016), une Includedirective est disponible.

Inclure : Incluez le ou les fichiers de configuration spécifiés. Plusieurs noms de chemins peuvent être spécifiés et chaque chemin peut contenir des caractères génériques globaux et des références "~" de type shell aux répertoires de départ de l'utilisateur. Les fichiers sans chemins absolus sont supposés être dans ~/.ssh. Une Includedirective peut apparaître à l'intérieur d'un bloc Matchou d' un Hostbloc 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 )

Christian Hudon
la source
2
C'est trop cool. Attendez-vous à cela. Le problème devrait enfin être résolu correctement :)
wrangler
2
Ajoutez simplement la directive Include en haut du configfichier. Je ne peux pas comprendre pourquoi cela ne fonctionne pas au fond.
survol du
17

Personnellement, j'utilise 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, en revenant:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

J'espère que cela vous aidera.

Szymon Jeż
la source
ssh -F <(cat .ssh/*.config)serait idéal. Je suis venu avec cela aussi, mais je reçois la même erreur. Quelqu'un sait quel est le problème ici?
sickill
2
SSH vérifie les autorisations de fichiers, je pense que ce type de redirection ne prend pas en charge cette vérification.
Camden Narzt
2

Je voudrais également utiliser cat config_* > configpour générer la configuration entière. 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 la configuration ???).

Je générerais un paquet (deb, rpm) et le placerais dans un dépôt local. Et dans le script postinst, le chat génère votre configuration. Vous pouvez également inclure un dossier local ... L’avantage est que les mises à jour de ssh / config sont activées quotidiennement lorsque cron-apt & Co est exécuté.

ThorstenS
la source
0

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

Puis déplacez votre existant configvers config.inet lancez makepour générer config.

blueyed
la source
0

J'ai joué avec le concept d'un config.drépertoire pour l'organisation de ma configuration. Donc, pour ajouter à la pile d'options ci-dessus, voici ce qui fonctionne 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 ~ / .ssh / config et habite dans la commande 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 sshMakeConfigau 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 sshMakeConfigune forme quelconque (directement, en achetant mon run-config ou en démarrant un nouveau shell)

Knope
la source