¿Puedes tener más de un archivo ~ / .ssh / config?

82

Tenemos un servidor bastión que usamos para conectarnos a múltiples hosts, y nuestro .ssh / config ha crecido a más de mil líneas (tenemos cientos de hosts a los que nos conectamos). Esto está comenzando a ser un poco difícil de manejar y me gustaría saber si hay una manera de dividir el archivo .ssh / config en varios archivos. Idealmente, deberíamos especificar en algún lugar que otros archivos se tratarían como un archivo .ssh / config, posiblemente como:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

He leído la documentación en ssh / config, y no veo que esto sea posible. Pero tal vez alguien más ha tenido un problema similar y ha encontrado una solución.

vaquero
fuente
Haga que cada usuario inicie sesión en el host del bastión con su propio nombre de usuario. Además, ¿qué está poniendo en el archivo de configuración que requiere una entrada para cada host? ¿No puede establecer algunos valores predeterminados que son comunes?
Jed Daniels
1
La misma pregunta en superuser.com: superuser.com/questions/247564/...
guettli
1
Pronto, en OpenSSH 7.3 eso debería ser posible. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Respuestas:

51

El ~/.ssh/configarchivo no tiene una directiva para incluir otros archivos, posiblemente relacionados con la verificación de SSH para permisos de archivos.

Las sugerencias sobre esto pueden incluir una secuencia de comandos para agrupar varios cambios juntos, ya sea en el sistema o mediante ganchos de registro en un repositorio. También se pueden buscar herramientas como Puppet o Augeas.

Sin embargo, sin importar cómo lo abordes, tendrás que concatenar archivos individuales para que sean un solo archivo desde fuera del archivo.

$ cat ~/.ssh/config_* >> ~/.ssh/config

nota: sobrescribir: > vs agregar:>>

Actualización de diciembre de 2017:

Desde 7.3p1 en adelante, existe la opción Incluir. Lo que le permite incluir archivos de configuración.

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.
Jeff Ferland
fuente
Gracias Jeff, esta es una buena idea. No sé demasiado sobre Puppet o Augeas, por lo que, por mantener las cosas lo más simples posible, su solución parece la mejor. Podría dividir la configuración en varias configuraciones y crear un script simple para recrear el archivo .ssh / config cada vez que se modifique uno de los archivos. No sé qué tan limpia es una solución, pero parece que funciona y funciona para mis propósitos.
Wrangler
52

Puede especificar el archivo de configuración actual para usar en la opción ssh de esta manera:

ssh -F /path/to/configfile

Parece que es la única forma.

Además, no hay forma de incluir una configuración en otra.

prisa
fuente
Una buena opción cuando se utiliza el módulo Net :: OpenSSH de Perl (por ejemplo, para múltiples archivos de clave privada), donde el módulo no ofrece todas las posibilidades.
Jimmy Koerting
36

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
2
Eso es muy bueno Esperamos esto. Finalmente debería resolver este problema de la manera correcta :)
wrangler
2
Simplemente agregue la directiva Incluir en la parte superior del configarchivo. No puedo entender por qué no funciona en la parte inferior.
pylover
17

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
ssh -F <(cat .ssh/*.config)Sería ideal. También se me ocurrió esto, pero recibo el mismo error. Alguien sabe cuál es el problema aquí?
sickill
2
ssh verifica los permisos de los archivos, creo que este tipo de redireccionamiento no admite esa verificación.
Camden Narzt
2

También usaría cat config_* > configpara generar toda la configuración. Pero no usaría puppet / cfengine, etc. para esto, si aún no están en su lugar (por cierto: ¿por qué no usar un sistema de administración de configuración?).

Generaría un paquete (deb, rpm) y lo pondría en un repositorio local. Y en la secuencia de comandos postinst el gato genera su configuración. Quizás también incluya una carpeta local ... La ventaja es que las actualizaciones ssh / config se activan diariamente mientras se ejecuta cron-apt & Co.

ThorstenS
fuente
0

Puede usar un Makefile en ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

Luego mueva su existente configa config.iny ejecute makepara generar config.

azulado
fuente
0

He estado jugando con el concepto de un config.ddirectorio para mi organización de configuración. Entonces, para agregar al conjunto de opciones anterior, esto es lo que ha estado funcionando para mí.

La estructura del directorio es algo así como

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

La función que construye ~ / .ssh / config y vive en la configuración de ejecución de mi shell es la siguiente

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

Opcionalmente, agregue sshMakeConfigal final de su configuración de ejecución si desea garantizar una nueva configuración en cada sesión de shell

Cada vez que necesito recompilar mi ~ / .ssh / config, lo hago ejecutando sshMakeConfigde alguna forma (directamente, obteniendo mi run-config o iniciando un nuevo shell)

golpear
fuente