¿Hay alguna manera de que un archivo de configuración SSH incluya otro?

131

En caso de que importe:

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

Me gustaría que un archivo de configuración SSH incluya otro. El caso de uso sería definir lo que quiera en mi .ssh/configarchivo predeterminado y luego incluir un par de cosas adicionales en un archivo separado (por ejemplo ~/.ssh/foo.config). Sin embargo, quiero que el segundo archivo incorpore el primero, por lo que no tengo que duplicar todo en el primero. ¿Eso es factible? ¡Gracias!

Joe Casadonte
fuente
2
Misma pregunta sobre serverfault: serverfault.com/questions/375525/…
guettli

Respuestas:

140

Desde 7.3p1 en adelante, existe la Includepalabra clave, que le permite incluir archivos de configuración.

Include

    Incluya los archivos de configuración especificados. Se pueden especificar varios nombres de ruta y cada nombre de ruta puede contener comodines globales (3) y, para configuraciones de usuario, referencias "~" similares a shell a directorios de inicio de usuarios. Se supone que los archivos sin rutas absolutas están ~/.sshincluidos si se incluyen en un archivo de configuración del usuario o /etc/sshsi se incluyen desde el archivo de configuración del sistema.  IncludeLa directiva puede aparecer dentro de un bloque Matcho Hostpara realizar una inclusión condicional.
Fuente: ssh_config (5) .

Por ejemplo, podrías tener en ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

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

Host laptop
    HostName laptop.lan

De los comentarios, use lo siguiente para incluir todos los archivos en el config.ddirectorio:

Include config.d/* 
Osaka
fuente
13
verifique la versión con $ ssh -V
Pieter
77
Use Include config.d/*para incluir todas las entradas en config.d.
Simon Woodside
17
Ftr: esto debe ir en la parte superior del archivo y no se puede agregar a la lista de Hostentradas.
dtk
2
Probado en Ubuntu 16.04. Sin embargo, funciona, pero el autocompletado está roto, lo que lo hace menos útil. Si desea actualizar ssh en ubuntu, consulte este enlace gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu
@dtk gracias por eso. Eso fue lo que me dejó perplejo
Adam Keenan
28

No, que yo sepa, esto no es posible.

Aquí están los enlaces a las solicitudes de funciones abiertas / tickets de error correspondientes:

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

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

rems
fuente
2
También este error en Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
DIOS MIO. Se está abriendo. Del 15/04/2016 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Esta respuesta era correcta en ese momento, pero ahora está desactualizada.
Mark Stosberg
25

Si desea iniciar un cliente ssh, puede hacerlo en bash:

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

entonces usas ssh normalmente y tendrá ambos archivos leídos en ese orden.

Para el demonio del servidor sshd, puede hacer lo mismo, solo use en -flugar de -Fy escriba esto donde inicie el demonio directamente. No necesitas un alias.

Una segunda posibilidad de acuerdo con la página del manual es colocar la configuración de todo el sistema /etc/ssh/ssh_configy la del usuario ~/.ssh/config.

Actualización Aparentemente hay algún problema con algunas versiones de bash y cómo se crean los dispositivos. (ver http://bugs.alpinelinux.org/issues/1465 )

Esta es una solución (aunque en mi opinión es fea):

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

así que si lo desea, puede crear una función a partir de él (o 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
fuente
1
Lamentablemente, esto no funciona en ssh de OSX: No se puede abrir el archivo de configuración del usuario / dev / fd / 63: Descriptor de archivo incorrecto
Ash Berlin-Taylor
No funciona para mí también en (Ubuntu 11.10) Linux dando el mismo error que @AshBerlin publicado anteriormente.
Szymon Jeż
@AshBerlin puede intentarlo también, esto debería funcionar también para OSX, hasta que el fallo es reparado
Estani
Dado que ssh verifica tres lugares, 1. línea de comando, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, no debería necesitar pasar ~/.ssh/configla línea de comando también. Solo alias ssh='ssh -F ~/.ssh/foo.config'y ~/.ssh/configdebería ser recogido después de eso. Siempre que no te importe foo.configque te carguen primero, eso debería ser más limpio que la solución anterior.
Jim
1
@ Jim no, no funciona así. Se usa el primero encontrado. ¿Lo has probado? de la página de manual "-F configfile: especifica un archivo de configuración alternativo por usuario. Si se proporciona un archivo de configuración en la línea de comandos, se ignorará el archivo de configuración de todo el sistema (/ etc / ssh / ssh_config)".
estani
17

Comenzando con ssh 7.3 (lanzado el 1 de agosto de 2016), hay una Includedirectiva disponible.

Incluir : incluye los archivos de configuración especificados. Se pueden especificar varios nombres de ruta y cada nombre de ruta puede contener comodines globales y referencias "~" similares a shell a los directorios de inicio de los usuarios. Se supone que los archivos sin rutas absolutas están en ~/.ssh. Una Includedirectiva puede aparecer dentro de una Matcho Hostbloquear para realizar inclusión condicional.

(Aquí está el enlace al informe de error resuelto, que también incluye el parche: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
fuente
14

De manera similar a la otra 'fea', aquí está el mío:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
fuente
Tenga en cuenta que el sftpcomando no activará el recálculo de la configuración.
VasyaNovikov
2
(Todavía me gusta la respuesta porque usa "config.d /" y es muy simple.)
VasyaNovikov
2
simple, elegante, pero hacky
code_monk
6

Bueno, hago un poco de trampa para hacer esto. En mis archivos bash .profile-ish tengo un bloque que reemplaza varias partes de mi directorio de inicio al iniciar sesión, así que solo genero uno nuevo cada vez. Ejemplo:

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

Esto también me permite hacer cosas como agregar bloques de configuración al archivo de configuración ssh solo si estoy en el host A o B, pero no en mis sistemas domésticos.

Ahora sé que alguien se quejará de que si inicias sesión mucho, esto podría causar una desaceleración excesiva, pero en la práctica nunca lo he notado. Y estoy seguro de que podría poner esto en un script y dispararlo también a través de cron.

Dave
fuente
3

Yo personalmente uso esos comandos para compilar la configuración 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.)

o:

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)

porque:

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

no me funciona, volviendo:

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

Espero que esto sea de alguna ayuda.

Szymon Jeż
fuente
Podrías ir un paso más allá y combinar esto con fswatch, para una compilación automatizada sobre el cambio de archivos
cavalcade
3

Otra solución basada en FUSE (no la probé yo mismo):

https://github.com/markhellewell/sshconfigfs

"En lugar de tener que seguir administrando un archivo grande, [...] cree un" archivo de configuración "dinámicamente a partir de muchos fragmentos lógicos más pequeños".

También encontré un artículo que hace esto a través de FIFOs: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

amontero
fuente
1
Encuentro que el contenido del comentario es lo suficientemente descriptivo: dice "FUSIBLE" (Quizás ampliar el acrónimo sería mejor); El enlace es solo para una implementación.
aviv
1
No estaba al tanto del problema de respuestas cortas, la respuesta se expandió. Parece que tendré que revisar el sitio para ver mis respuestas de vez en cuando, en ausencia de notificaciones por correo electrónico :) Aprendí a usar favoritos, por ahora. Gracias por los comentarios.
amontero
2

Ninguna de estas soluciones de alias funciona para gitotros programas que no sean ssh.

He abofeteado un rápido y sucio, pero es posible que desee mejorarlo.

Agregue esto a su ~/.bashrc

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

Cada vez que inicie una sesión, fusionará todos los archivos ~/.ssh/config.d. (línea 3)

La desventaja de esta versión es que si cambia la ~/.ssh/configpróxima sesión, abrirá sus cambios, por lo que para evitar que mueva el archivo existente a un archivo .bak. (línea 2) El problema es que tendrás un montón de archivos .bak después de un tiempo.

Dean Rather
fuente
Excelente con agregar alguna is_anything_changedcondición
vp_arth
1

Puede actualizar fácilmente la versión SSH en Ubuntu a v7.3 (probado en Ubuntu Xenial 16.04) instalando paquetes 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

Verifique la versión SSH

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

Configure SSH para usar incluye desde el directorio ~ / .ssh / config.d

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

Mi tonta respuesta:

  • Intenté instalar OpenSSH> 7.3 en Xenial (16.04)
  • No me gustó el desastre que hizo

Así que me decidí por esto:

  • Mantenga sus archivos de configuración de OpenSSH separados en ~/.ssh/config.d/
  • Cuando cambies uno, haz cat ~/.ssh/config.d/* > ~/.ssh/config
  • En el glorioso día que actualice a una versión de distribución que tenga OpenSSH 7.3p1 o posterior, puede crear un archivo que contenga

Include config.d/*

Adrian
fuente
0

Tampoco puedo actualizar SSH en mi máquina.

Usé GNU make para generar el archivo de configuración ssh solo cuando era necesario :

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

Entonces ssh tiene un alias para

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

Funciona a las mil maravillas.

gmathio
fuente