Назад | Перейти на главную страницу

SSH 'сброс соединения' при попытке нескольких одновременных исходящих подключений к одному и тому же узлу

У меня есть сценарий, который выполняет удаленную задачу Rake, которая выполняется один раз для каждой из двух ролей. Обе роли являются пользователями одного экземпляра Vagrant. Таким образом, по сути, задача состоит в том, чтобы открыть два SSH-соединения с одной и той же виртуальной машиной параллельно и выполнить некоторые команды для каждого соединения. Я часто замечаю, что при выполнении этой задачи возникает следующая ошибка:

ssh_exchange_identification: read: Connection reset by peer

Однако это происходит только на нашем подчиненном узле Jenkins, которым является Mac Mini. Я придумал простой пример, который воспроизводит поведение сброса соединения:

ssh root@vagrant-target "echo hello" & ssh root@vagrant-target "echo bye"

Я также обнаружил, что выполнение указанной выше команды не воспроизводит ошибку на моем локальном экземпляре MacBook Pro, который имеет ту же настройку Vagrant, даже если я делаю это неоднократно.

На обеих машинах установлена ​​одинаковая версия ОС, а также одна и та же версия SSH. Я также выполнил приведенные выше команды ssh с -vvv, но не увидел ничего очевидного. Единственное, что приходит в голову, это то, что я вижу некоторые процессы sshd на машине Jenkins, предположительно используемые Jenkins:

jenkins        34394   0.1  0.0  2471700    840   ??  S     6:27PM   0:00.05 /usr/sbin/sshd -i
jenkins        35220   0.0  0.0  2470872   1284   ??  S     6:27PM   0:01.38 /usr/sbin/sshd -i
root           35218   0.0  0.0  2469596   2908   ??  S     6:27PM   0:00.04 /usr/sbin/sshd -i

Есть ли у кого-нибудь идеи относительно того, почему такое поведение проявляется на одной машине, а на другой нет?

Вы пробовали установить соединение с главным управляющим устройством? это позволит вам мультиплексировать несколько сеансов ssh через одно соединение.

Для настройки мастера управления используйте

ssh -o "ControlMaster=yes" -o "ControlPath=~/.ssh/%r@%h:%p" root@server

-o «ControlMaster = yes» сообщает ssh, что это соединение будет главным процессом. Путь управления - это сокет, настроенный для разрешения других сеансов ssh через это соединение.

Чтобы ваш ssh использовал путь управления, вам просто нужно использовать его в отдельном терминале.

ssh -o  "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds" & \
ssh -o  "ControlPath=~/.ssh/%r@%h:%p" root@server "cmds"

Если это не решает проблему, можете ли вы опубликовать вывод ssh с флагами -vvv?