Cómo importar tu config SSH en un gestor de configuración SSH

Lista los hosts reales de ~/.ssh/config y de cada archivo indicado por Include, y ejecuta ssh -G nombre para cada uno para ver la dirección, el puerto, el usuario, la clave y el host de salto que ssh usa de verdad. Esa vista resuelta es lo que una importación debe reproducir. Antes, haz copia del archivo, las claves y known_hosts, y usa un CSV cuando los servidores estén en una hoja de cálculo.

Actualizada el . Ejecutado en macOS 27 con OpenSSH 10.3 sobre una config de prueba con Include, ProxyJump, LocalForward y Host *: la lista de hosts con awk, ssh -G para cada host y el bucle del CSV se ejecutaron, y su salida se muestra con direcciones de ejemplo.

Qué hay en un archivo de configuración

Antes de mover una config, ten claro qué significa cada parte, porque solo una parte describe servidores:

Include config.d/*

Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519_work
  ProxyJump bastion
  LocalForward 5433 localhost:5432

Host *
  ServerAliveInterval 60
  • Host web es un servidor: un nombre que escribes, con su dirección y sus ajustes.
  • Host * y otros patrones como *.example.com no son servidores. Añaden valores por defecto a cada host que coincide.
  • Include carga otros archivos, aquí ~/.ssh/config.d/*, como si estuvieran pegados en ese punto.
  • ProxyJump y las líneas Forward enlazan servidores entre sí y con túneles.

Para cada opción, ssh se queda con el primer valor que lee, entre todos los bloques que coinciden. La guía del archivo de configuración SSH explica esta regla con ejemplos.

Listar cada host, también de los archivos Include

Un grep Host rápido se salta los archivos incluidos y mezcla servidores con patrones. Esto lista solo los nombres reales, del archivo principal y de los incluidos:

awk 'tolower($1)=="host" { for (i = 2; i <= NF; i++) if ($i !~ /[*?!]/) print $i }' ~/.ssh/config ~/.ssh/config.d/*
web
bastion

Cambia la segunda ruta según tus propias líneas Include, o quítala si no tienes ninguna. Un nombre que aparece dos veces está definido en dos sitios, y para cada opción solo ganan los valores del primer bloque.

Revisar cada host con ssh -G

ssh -G muestra los ajustes finales de un host, con todos los archivos y patrones aplicados, y no se conecta. Es la verdad que una importación debe respetar:

ssh -G web | grep -E '^(hostname|user|port|identityfile|proxyjump|localforward|remoteforward|dynamicforward) '
user deploy
hostname 203.0.113.10
port 2222
localforward 5433 [localhost]:5432
identityfile ~/.ssh/id_ed25519_work
proxyjump bastion

Busca sorpresas: un user que viene de Host *, una ruta de clave que no existe o un host de salto que no está en tu lista. Para comprobar que cada archivo de clave existe de verdad:

ls -l ~/.ssh/id_ed25519_work ~/.ssh/id_ed25519_work.pub

Los hosts de salto tienen su propia guía, ejemplos de ProxyJump y host de salto, y los reenvíos se explican en túneles SSH: locales, remotos y dinámicos.

Hacer copia y exportar a CSV si hace falta

Guarda una copia de todo lo que lee una importación, para comparar después y volver atrás si hace falta:

mkdir -p ~/ssh-backup
cp -p ~/.ssh/config ~/.ssh/known_hosts ~/ssh-backup/
cp -rp ~/.ssh/config.d ~/ssh-backup/

Algunas herramientas, y algunos equipos, trabajan desde una hoja de cálculo. Este bucle convierte cada host en una línea CSV con los valores que ssh usa de verdad, en un formato habitual con las columnas de grupos, etiquetas y contraseñas vacías:

{
  echo 'Groups,Label,Tags,Hostname/IP,Protocol,Port,Username,Password'
  for h in $(awk 'tolower($1)=="host" { for (i = 2; i <= NF; i++) if ($i !~ /[*?!]/) print $i }' ~/.ssh/config ~/.ssh/config.d/*); do
    ssh -G "$h" | awk -v h="$h" '$1=="hostname"{n=$2} $1=="port"{p=$2} $1=="user"{u=$2} END{print ","h",,"n",ssh,"p","u","}'
  done
} > hosts.csv
Groups,Label,Tags,Hostname/IP,Protocol,Port,Username,Password
,web,,203.0.113.10,ssh,2222,deploy,
,bastion,,198.51.100.5,ssh,22,admin,

Cambia las rutas del bucle igual que en la lista de hosts. Rellena grupos como Acme y etiquetas como prod en una hoja de cálculo antes de importar. Si añadiste contraseñas al archivo, bórralo al terminar.

Llevarte known_hosts

Tu known_hosts guarda las huellas que ya aceptaste. Importarlo hace que la primera conexión desde la nueva herramienta no te pida otra vez confiar en cada servidor. Para comprobar si un host está:

ssh-keygen -F 203.0.113.10
ssh-keygen -F '[203.0.113.10]:2222'

Un host en un puerto distinto del 22 se guarda entre corchetes con el puerto, como en la segunda línea. Si HashKnownHosts está activo, los nombres están en hash y solo una búsqueda como esta los encuentra. Más en known_hosts explicado.

Después de importar

  • Compara algunos servidores con la salida de ssh -G: dirección, puerto, usuario, clave y host de salto.
  • Conéctate a un servidor de cada tipo: uno directo, uno detrás de un host de salto y uno con túnel.
  • Conserva el archivo original para scp, rsync y git, que siguen leyéndolo. Importar copia los ajustes, no cambia ~/.ssh/config.
  • Ordena el resultado en grupos y etiquetas, como en cómo gestionar muchos servidores SSH.

Los pasos dentro de la app están en la documentación sobre importar hosts.

Preguntas

¿Qué es un gestor de configuración SSH?

Una app que guarda lo mismo que ~/.ssh/config, como direcciones, usuarios, puertos, claves, hosts de salto y túneles, en forma de servidores guardados que editas en un formulario y ordenas en grupos, en lugar de bloques en un archivo de texto.

¿Se importan los archivos Include con ~/.ssh/config?

Deberían, porque ssh los lee como parte del archivo. Antes de importar, comprueba que ssh -G muestra los ajustes que vienen de los archivos incluidos, para saber qué esperar.

¿Los valores de Host * se aplican a los servidores importados?

En ssh se aplican todos los bloques que coinciden y gana el primer valor, así que un servidor recibe los valores de Host * que no definió él mismo. ssh -G muestra ese resultado final para cada host.

¿Puedo importar hosts SSH desde un archivo CSV?

Sí, si el gestor lee CSV. Un formato habitual es Groups, Label, Tags, Hostname/IP, Protocol, Port, Username y Password, un servidor por línea.

Fuentes

Más en Configuración y muchos servidores

Todas las guías