Dans le cas où cela compte:
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!
À 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
Source: ssh_config (5) .~/.ssh
if inclus dans un fichier de configuration utilisateur ou/etc/ssh
if inclus dans le fichier de configuration système. La directiveInclude
peut apparaître à l'intérieur d'un blocMatch
ouHost
pour effectuer l'inclusion conditionnelle.
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/*
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
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"
}
À 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 directiveInclude
peut apparaître dans un blocMatch
ouHost
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 )
De la même manière que l'autre "moche", voici le mien one-liner:
alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
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.
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/
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.
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.
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
Ma réponse idiote:
Alors je me suis installé pour ça:
~/.ssh/config.d/
cat ~/.ssh/config.d/* > ~/.ssh/config
Include config.d/*
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.