web-dev-qa-db-fra.com

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

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 fichier .ssh/config par défaut, puis de pré-suspendre quelques éléments supplémentaires dans un fichier séparé (par exemple, ~/.ssh/foo.config). Je veux cependant que le deuxième fichier incorpore le premier. Je n'ai donc pas à tout dupliquer dans le premier. Est-ce faisable? Merci!

124
Joe Casadonte

À partir de 7.3p1, il existe le mot clé Include, 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 chemins absolus sont supposés être dans ~/.sshif inclus dans un fichier de configuration utilisateur ou /etc/sshif inclus dans le fichier de configuration système. La directiveIncludepeut apparaître à l'intérieur d'un blocMatchouHostpour effectuer l'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 en ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

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

Include config.d/* 
126
Osaka

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

28
rems

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 serveur sshd, vous pouvez faire de même, utilisez simplement -f au lieu de -F et notez-le à l’endroit 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 placer la configuration système dans /etc/ssh/ssh_config et l'utilisateur un dans ~/.ssh/config.

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

Ceci est une solution de contournement (bien qu'à 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

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"
}
24
estani

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

Include : Inclut 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 directive Include peut apparaître dans 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 )

17
Christian Hudon

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

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

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 comprendra que si vous vous connectez souvent, 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
Dave

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 fragments logiques plus petits."

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

3
amontero

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.

3
Szymon Jeż

Aucune de ces solutions d'alias ne fonctionne pour git ou pour 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 de ~/.ssh/config.d sont fusionnés. (ligne 3)

L'inconvénient de cette version est que si vous changez ~/.ssh/config prochaine session, vos modifications seront perdues. Par conséquent, pour éviter que je ne 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.

2
Dean Rather

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
1
panticz.de

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/
  • Quand 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/*

0
Adrian

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 si 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.

0
gmathio