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 webes un servidor: un nombre que escribes, con su dirección y sus ajustes.Host *y otros patrones como*.example.comno son servidores. Añaden valores por defecto a cada host que coincide.Includecarga otros archivos, aquí~/.ssh/config.d/*, como si estuvieran pegados en ese punto.ProxyJumpy las líneasForwardenlazan 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
- ssh_config(5), manual de OpenBSD
- ssh(1), la opción -G, manual de OpenBSD
- ssh-keygen(1), la opción -F, manual de OpenBSD
- Notas de la versión 7.3 de OpenSSH, Include