У меня есть сценарий, который выполняет удаленную задачу 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?