Problema
Intentas mantenerte seguro. ¿Cómo dices? Sí, demasiado seguro. Si trabajas para varios clientes y eres como yo, quizá no quieras usar la misma clave para cada cliente. Ahora, por comodidad, añades todas tus claves a tu agente local:
ssh-add key1
...
ssh-add keyN
Genial. Seguro y a la vez cómodo. Hasta que recibes un error de autenticación:
Received disconnect from a.b.c.d port 22:2: Too many authentication failures
Compruebas dos veces el nombre de usuario. Compruebas dos veces que tu clave está cargada en el agente. Empiezas a dudar de ti mismo. Y aun así nada parece explicarlo.
Motivo
Tras buscar un poco en la red, de repente das con la respuesta:
Tu cliente SSH envía la primera clave. Si no se acepta, la segunda, y así sucesivamente. Y si has asegurado un poco tu servidor, tras cierto número de intentos simplemente cierra la conexión con el error anterior. Lo complicado es que con algunos servidores funciona (aquellos en los que la clave está dentro del límite configurado) y con otros no. En cuanto lees la explicación, queda claro y es totalmente comprensible.
Otro obstáculo: pasar simplemente -i no ayuda, porque -i no limita las claves a la indicada.
Solución
Puedes sortearlo pasando opciones a tu cliente SSH que limiten la clave a una concreta:
-o "IdentitiesOnly yes" -i <ruta a tu clave privada>
El inconveniente evidente es que tienes que recordar estas opciones o configurarlas en tu configuración de SSH para cada servidor.
Otro enfoque es reconfigurar tu agente según el trabajo que estés haciendo. Porque nunca saltamos de una tarea a otra y volvemos, ¿verdad? Para seguir ese camino puedes gestionarlo con direnv así:
ssh-add -D
ssh-add <key>
Al cambiar a ese directorio se eliminarían todas las claves existentes y se añadiría la indicada. El inconveniente aquí es que esto funciona bien en una terminal, pero los entornos gráficos quedan fuera. Además, al ir de un lado a otro, tus claves se eliminan en una terminal y la otra terminal queda inválida para el trabajo que tienes ahí.
Podrías arrancar otro agente y exportar el socket por separado para cada shell, pero eso no lo he probado.