Проблема

При попытке подключения к нужному узлу по SSH в терминал выводится сообщение об ошибке:

Received disconnect from <HOST> port 22:2: Too many authentication failures
Disconnected from <HOST> port 22

Это сообщение говорит о том, что вы превысили количество неудачных подключений к узлу. Такое бывает, когда у вас много ключей SSH. Я вообще считаю правильным, чтобы для каждого узла или сервиса была своя пара ключей.

Причина проблемы следующая:

  1. Если в настройках подключения не указано, какой ключ использовать, агент SSH начинает перебирать все доступные ключи.
  2. Получив отказ при попытке подключения с одним узлом, агент пробует подключиться со следующим.
  3. Примерно после третьей попытки сервер SSH на удалённом узле решает, что его пытаются взломать тупым перебором. Он блокирует ваш IP-адрес и выдаёт указанное выше сообщение об ошибке.

Решения

Явное указание ключа SSH

В аргументах команды SSH можно явно задать путь к приватному ключу, который нужно использовать при подключении:

ssh <user>@<host> -i /path/to/private/key

В этом случае перебора не происходит, сервер SSH не блокирует ваш IP-адрес.

Создание файла настроек

Если подключаться к разным узлам приходится часто, а тратить время на указание нужного ключа не хочется, проще заполнить файл настроек.

  1. Создайте в каталоге ~/.ssh/ файл config.
  2. Добавьте в файл ~/.ssh/config настройки подключения к нужным узлам:

     Host <name>
         Hostname       <host>
         IdentityFile   ~/.ssh/<private_key>
         IdentitiesOnly yes
    

    Пример:

     Host GitHub
         Hostname       github.com
         IdentityFile   ~/.ssh/github.com
         IdentitiesOnly yes
    

    Подсказка: Очень удобно хранить ключи в файлах с названиями FQDN узлов, сразу понятно, какой ключ от чего. Попробуйте угадать с одного раза, какой ключ для какого сервиса я использую:

    • github.com;
    • gitlab.com;
    • gitflic.com;
    • reg.ru.