Question Y a-t-il un moyen pour un fichier de configuration SSH d'en inclure un autre?


Au cas où cela compte:

  • OS: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Je voudrais un fichier de configuration SSH pour en inclure un autre. Le cas d'utilisation serait de définir ce que je veux dans mon défaut .ssh/config fichier, puis pré-suspendre quelques éléments supplémentaires dans un fichier séparé (par ex. ~/.ssh/foo.config). Je souhaite que le second fichier incorpore le premier, mais je n'ai pas besoin de tout dupliquer dans le premier. Est-ce faisable? Merci!


109
2018-02-18 17:45


origine


Même question sur serverfault: serverfault.com/questions/375525/... - guettli


Réponses:


A partir de 7.3p1 et plus, il y a le Include mot-clé, ce qui vous permet d'inclure des fichiers de configuration.

Include

      Incluez les fichiers de configuration spécifiés.   Plusieurs chemins peuvent être spécifiés et chaque chemin   peut contenir des jokers glob (3) et,   pour les configurations utilisateur, des références au shell "~" à la page d'accueil de l'utilisateur   répertoires. Les fichiers sans chemins absolus sont   supposé être en ~/.ssh si inclus dans un fichier de configuration utilisateur   ou /etc/ssh si inclus de la   fichier de configuration du système. Include directive peut   apparaître à l'intérieur d'un Match ou Host bloc   effectuer une inclusion conditionnelle.
La source: ssh_config (5).

Par exemple, vous pourriez avoir dans ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

et en ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

À partir des commentaires, utilisez ci-dessous pour inclure tous les fichiers dans le config.d annuaire:

Include config.d/* 

96
2017-11-05 20:12



vérifier la version avec $ ssh -V - Pieter
Utilisation Include config.d/* inclure toutes les entrées dans config.d. - Simon Woodside
Ftr: cela doit aller en haut du fichier et ne peut pas simplement être ajouté à la liste des Host entrées. - dtk
essayé sur Ubuntu 16.04. Bien que cela fonctionne, le autocomplete est cassé ce qui le rend moins utile. Si vous voulez mettre à jour ssh sur ubuntu, cochez ce lien gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677 - cwhsu


Non, à ma connaissance, ce n'est pas possible.

Voici les liens vers les demandes de fonctionnalités ouvertes / les tickets de bogue correspondants:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495


28
2018-02-18 17:54



Aussi ce bug sur Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189 - Lluís
OMG. C'est du chahut. De 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3 - oschrenk


Si vous voulez démarrer un client ssh, vous pouvez le faire en bash:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

alors vous utilisez normalement ssh et les deux fichiers seront lus dans cet ordre.

Pour le démon serveur sshd vous pourriez faire la même chose, utilisez simplement -f au lieu de -F et notez-le là où vous lancez le démon directement. vous n'avez pas besoin d'un alias.

Une deuxième possibilité selon la page de manuel est de mettre la configuration système dans /etc/ssh/ssh_config et l'utilisateur en un ~/.ssh/config.

Mettre à jour Apparemment, il y a un problème avec certaines versions bash et comment les périphériques sont créés. (voir http://bugs.alpinelinux.org/issues/1465)

Ceci est une solution de contournement (mais à mon avis moche):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

Donc, si vous le souhaitez, vous pouvez créer une fonction (ou un script):

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

24
2018-04-19 10:51



Malheureusement, cela ne fonctionne pas sur ssh OSX: Impossible d'ouvrir le fichier de configuration utilisateur / dev / fd / 63: descripteur de fichier incorrect - Ash Berlin-Taylor
Cela ne fonctionne pas pour moi aussi sur (Ubuntu 11.10) Linux donnant la même erreur que @AshBerlin publiée ci-dessus. - Szymon Jeż
@AshBerlin vous pouvez aussi essayer, cela devrait fonctionner aussi pour OSX, jusqu'à ce que le bogue soit corrigé - estani
Étant donné que ssh vérifie trois endroits, 1. ligne de commande, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, vous ne devriez pas avoir besoin de passer ~/.ssh/config sur la ligne de commande également. Juste alias ssh='ssh -F ~/.ssh/foo.config' et ~/.ssh/config devrait être ramassé après cela. Tant que cela ne vous dérange pas foo.config être chargé en premier qui devrait être plus propre que la solution de contournement ci-dessus. - jim
@jim non ça ne marche pas comme ça. Le premier trouvé est utilisé. L'as tu essayé? de la page de manuel "-F configfile: Spécifie un alternative fichier de configuration par utilisateur. Si un fichier de configuration est fourni sur la ligne de commande, le fichier de configuration système (/ etc / ssh / ssh_config) sera ignoré. " - estani


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

Comprendre: Incluez les fichiers de configuration spécifiés. Chemin multiple   les noms peuvent être spécifiés et chaque chemin peut contenir un glob   caractères génériques et références «~» de type shell aux répertoires personnels des utilisateurs.   Les fichiers sans chemins absolus sont supposés être dans ~/.ssh. Un    Include directive peut apparaître à l'intérieur d'un Match ou Host bloquer à   effectuer l'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)


15
2017-07-11 15:22





De la même manière que l’autre «moche», voici mon one-liner:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

14
2018-02-21 09:02



Notez que sftp La commande ne déclenchera pas le recalcul de la configuration. - VasyaNovikov
(J'aime toujours la réponse car elle utilise "config.d /" et est très simple.) - VasyaNovikov
simple, élégant, mais hacky - code_monk


Eh bien, je triche un peu pour faire ça. Dans mes fichiers bash .profile-ish, j'ai un bloc qui remplace les différentes parties de mon répertoire personnel lors de la connexion, alors j'en génère un nouveau à chaque fois. Exemple:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

Cela me permet également de faire des choses comme ajouter des blocs de configuration au fichier de configuration ssh uniquement si je suis sur l'hôte A ou B, mais pas sur mes systèmes personnels.

Maintenant, je sais, si quelqu'un se connecte beaucoup, cela pourrait causer un ralentissement excessif, mais en pratique je ne l'ai jamais remarqué. Et je suis sûr que vous pourriez mettre cela dans un script et le lancer via cron aussi.


6
2017-11-20 19:26





J'utilise personnellement ces commandes pour compiler la configuration de 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)

car:

alias ssh='ssh -F <(cat .ssh/*.config)'

ne fonctionne pas pour moi, revenant:

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

J'espère que cela vous aidera.


3
2017-11-27 15:14



Vous pouvez aller plus loin et combiner ceci avec fswatch, pour la compilation automatisée lors du changement de fichier - cavalcade


Une autre solution basée sur FUSE (non testée moi-même):

https://github.com/markhellewell/sshconfigfs

"Plutôt que de continuer à gérer un gros fichier, construisez [...] plutôt un fichier de configuration" dynamiquement à partir de nombreux blocs logiques plus petits. "

J'ai également trouvé un article le faisant via les FIFO: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


3
2018-06-10 17:54



Cela me semble être à peine plus qu'un lien vers un site externe peut donc être supprimé. (Parce que les liens peuvent «mourir» et qu'il est au moins utile de résumer le contenu d’ailleurs, les gens ne sont pas obligés de visiter l’autre site pour plus de détails.) - pnuts
Je trouve que le contenu du commentaire est suffisamment descriptif - il est dit "FUSIBLE" (peut-être que l'expansion de l'acronyme serait préférable); Le lien est juste pour une implémentation. - aviv
FUSIBLE. @aviv Eh bien, la réponse n'a pas encore été supprimée, alors j'espère que rien ne sera fait! - pnuts
N'était pas au courant de problèmes de réponses courtes, réponse élargie. On dirait que je devrai vérifier le site pour trouver mes réponses de temps en temps, en l'absence de notifications par courrier électronique :) J'ai appris à utiliser les favs, maintenant. Merci pour les commentaires. - amontero


Aucune de ces solutions d'alias ne fonctionne pour git ou d'autres programmes autres que ssh.

J'ai giflé un rapide et sale, mais vous pourriez vouloir l'améliorer.

Ajoutez ceci à votre ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

Chaque fois que vous démarrez une session, tous les fichiers sont fusionnés. ~/.ssh/config.d. (ligne 3)

L'inconvénient de cette version est que si vous changez ~/.ssh/config la prochaine session que vous ouvrez, vos modifications seraient perdues, afin d'éviter que je déplace le fichier existant dans un fichier .bak. (ligne 2) Le problème, c'est que vous allez avoir beaucoup de fichiers .bak après un certain temps.


2
2018-05-19 09:45



Excellent avec quelques ajouts is_anything_changed condition - vp_arth