Est-il possible qu'un fichier de configuration SSH en inclue un autre?

131

Dans le cas où cela compte:

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

J'aimerais qu'un fichier de configuration SSH en inclue un autre. Le cas d'utilisation serait de définir ce que je veux dans mon .ssh/configfichier par défaut , puis de pré-ajouter quelques éléments supplémentaires dans un fichier séparé (par exemple ~/.ssh/foo.config). Je souhaite cependant que le deuxième fichier intègre le premier. Je n'ai donc pas à tout dupliquer dans le premier. Est-ce faisable? Merci!

Joe Casadonte
la source
2
Même question sur serverfault: serverfault.com/questions/375525/…
guettli

Réponses:

140

A partir de 7.3p1, il y a le Includemot - clé, qui vous permet d'inclure des fichiers de configuration.

Include

    Incluez le ou les fichiers de configuration spécifiés. Plusieurs chemins d'accès peuvent être spécifiés et chaque chemin d'accès peut contenir des caractères génériques globaux (3) et, pour les configurations utilisateur, des références «~» de type shell aux répertoires personnels de l'utilisateur. Les fichiers sans chemin d'accès absolu sont supposés être dans ~/.sshs'ils sont inclus dans un fichier de configuration utilisateur ou /etc/sshs'ils sont inclus dans le fichier de configuration système.  Includedirective peut apparaître à l'intérieur d'un bloc Matchou d' un Hostbloc pour effectuer une inclusion conditionnelle.
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 dans ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

A partir des commentaires, utilisez ce qui suit pour inclure tous les fichiers du config.drépertoire:

Include config.d/* 
Osaka
la source
13
vérifier la version avec $ ssh -V
Pieter
7
Utilisez Include config.d/*pour inclure toutes les entrées dans config.d.
Simon Woodside
17
Ftr: ceci doit être placé en haut du fichier et ne peut pas simplement être ajouté à la liste des Hostentrées.
dtk
2
essayé sur Ubuntu 16.04. Bien que cela fonctionne, mais l' auto-complétion est cassée, ce qui la rend moins utile. Si vous souhaitez mettre à niveau ssh sur ubuntu, consultez ce lien gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu le
@ Dtk merci pour cela. C'est ce qui me stoppait
Adam Keenan
28

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

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

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

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

rems
la source
2
Aussi ce bug sur Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
OMG. Cela se passe. De 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Cette réponse était correcte à l'époque, mais est maintenant obsolète.
Mark Stosberg
25

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)'

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

Pour le démon de serveur, sshdvous pouvez faire la même chose, utilisez simplement -fau lieu de -Fet notez-le où vous démarrez directement le démon. vous n'avez pas besoin d'un alias.

Une deuxième possibilité, selon la page de manuel, est de mettre la configuration système /etc/ssh/ssh_configet celle de l'utilisateur ~/.ssh/config.

Mise à jour Apparemment, il existe un problème avec certaines versions de bash et la façon dont les périphériques sont créés. (voir http://bugs.alpinelinux.org/issues/1465 )

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

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

alors si vous voulez, 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"
}
estani
la source
1
Malheureusement, cela ne fonctionne pas sous 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 également sur (Ubuntu 11.10) Linux en donnant la même erreur que @AshBerlin publiée ci-dessus.
Szymon Jeż
@AshBerlin vous pouvez l'essayer aussi, cela devrait également fonctionner pour OSX, jusqu'à ce que le bogue soit corrigé
estani
Etant donné que ssh vérifie trois endroits, 1. la ligne de commande, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, vous ne devriez pas avoir besoin de passer également ~/.ssh/configsur la ligne de commande. Juste alias ssh='ssh -F ~/.ssh/foo.config'et ~/.ssh/configdevrait être ramassé après cela. Tant que cela ne vous dérange pas d' foo.configêtre chargé en premier, cela devrait être plus propre que la solution de contournement ci-dessus.
Jim
1
@ Jim non, ça ne marche pas comme ça. Le premier trouvé est utilisé. L'as tu essayé? depuis la page de manuel "-F configfile: spécifie un fichier de configuration alternatif par utilisateur. Si un fichier de configuration est indiqué sur la ligne de commande, le fichier de configuration système (/ etc / ssh / ssh_config) sera ignoré."
estani
17

À 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
14

De la même manière que l'autre "moche", voici le mien one-liner:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
la source
Notez que cette sftpcommande ne déclenchera pas de recalcul de configuration.
VasyaNovikov
2
(J'aime toujours la réponse car elle utilise "config.d /" et est très simple.)
VasyaNovikov
2
simple, élégant et pourtant hacky
code_monk
6

Eh bien, je triche un peu pour faire ça. Dans mes fichiers bash .profile-ish, il y a un bloc qui remplace divers éléments de mon répertoire personnel lors de la connexion. Par conséquent, j'en génère simplement 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 domestiques.

Maintenant, je sais que quelqu'un va comprendre que si vous vous connectez souvent, vous risquez 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.

Dave
la source
3

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
Vous pouvez aller plus loin et combiner cela avec fswatch pour une compilation automatisée des modifications de fichiers
cavalcade le
3

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

https://github.com/markhellewell/sshconfigfs

"Plutôt que de devoir continuer à gérer un gros fichier, créez plutôt un" fichier "de configuration de manière dynamique à partir de nombreux morceaux logiques plus petits."

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

amontero
la source
1
Je trouve que le contenu du commentaire est assez descriptif - il est écrit "FUSE" (il serait peut-être préférable de développer l’acronyme); Le lien est juste à une implémentation.
Aviv
1
Je n'étais pas au courant du problème des réponses courtes, réponse élargie. On dirait que je devrai vérifier de temps en temps sur le site mes réponses, en l'absence de notifications par e-mail :) Appris à utiliser les favs, maintenant. Merci pour les commentaires.
amontero
2

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

J'ai giflé ensemble, mais vous voudrez peut-être 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 se fusionnent ~/.ssh/config.d. (ligne 3)

L'inconvénient de cette version est que, si vous modifiez ~/.ssh/configla session suivante, vous ouvrez vos modifications et que, pour éviter cela, 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 moment.

Dean plutôt
la source
Excellent avec l'ajout de is_anything_changedconditions
vp_arth
1

Vous pouvez facilement mettre à niveau la version SSH sur Ubuntu vers la version 7.3 (testée sur Ubuntu Xenial 16.04) en installant des packages à partir de Yakkety:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

Vérifier la version de SSH

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

Configurez SSH pour utiliser des inclus dans le répertoire ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
panticz.de
la source
0

Ma réponse idiote:

  • J'ai essayé d'installer OpenSSH> 7.3 sur Xenial (16.04)
  • N'a pas aimé le désordre qu'il a fait

Alors je me suis installé pour ça:

  • Conservez vos fichiers de configuration OpenSSH séparés dans ~/.ssh/config.d/
  • Lorsque vous en changez un, faites cat ~/.ssh/config.d/* > ~/.ssh/config
  • Le jour glorieux où vous passez à une version de la distribution avec OpenSSH 7.3p1 ou une version plus récente, vous pouvez créer un fichier contenant

Include config.d/*

Adrian
la source
0

Je ne peux pas non plus mettre à niveau SSH sur ma machine.

J'ai utilisé GNU make pour générer le fichier de configuration ssh uniquement lorsque cela est nécessaire :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Ensuite, ssh est associé à

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Il fonctionne comme un charme.

gmathio
la source