2013-12-05 3 views
15

Я создаю небольшой скрипт для обновления некоторых удаленных серверов (2+)
Я делаю несколько подключений к каждому серверу; есть способ, которым я могу повторно использовать SSH-соединения, поэтому мне не нужно открывать слишком много сразу?Как повторно использовать ssh-соединение

+0

Вы должны добавить дополнительную информацию о том, как вы создаете соединения, чтобы получить лучший ответ: на каком языке, на какой платформе, с какой библиотекой и т. Д. –

+0

Задумывались ли вы об использовании каких-либо положений, таких как марионетка, шеф-поваром или солью? – Femaref

+1

У меня есть пара серверов за балансиром нагрузки. У меня есть основной скрипт сборки, работающий нормально; Я не хочу идти слишком далеко вниз по кроличьей норе, если у меня есть работы. Я открываю соединение для обновления определенного файла, открываю соединение с git pull, merge и т. Д. И т. Д., А затем открываю третий, чтобы обновить другой файл. – onassar

ответ

18

Если открыть первое соединение с -M:

ssh -M $REMOTEHOST 

последующие подключения к $REMOTEHOST будет «контрейлерных перевозок» на соединения, установленного мастером ssh. Наиболее заметно, что дальнейшая аутентификация не требуется. См. man ssh_config в разделе «ControlMaster» для получения более подробной информации. Используйте -S, чтобы указать путь к общему сокету; Я не уверен, что такое по умолчанию, потому что вместо этого я настраиваю совместное использование соединений с помощью файла конфигурации.

В моем .ssh/config файл, у меня есть следующие строки:

host * 
    ControlMaster auto 
    ControlPath ~/.ssh/ssh_mux_%h_%p_%r 

Таким образом, я не должен забывать использовать -M или -S; ssh указывает, существует ли уже существующее соединение для комбинации хоста/порта/имени пользователя и использует это, если это возможно.

+0

Beautiful. Именно то, что я искал. Я проверю и вернусь и подтвержу. – onassar

+0

По-прежнему существует разрыв связи. Это ожидалось? Я предполагаю, что для последующих соединений не нужен флаг '-M'? – onassar

+0

Я забыл упомянуть опцию '-S' для других соединений, поэтому они знают, с каким мастером подключиться. Я обновлю ответ. – chepner

8

В качестве альтернативы, вы можете сделать это следующим образом:

$ssh_conn="ssh -t -o ControlPath=~/.ssh/master-$$ -o ControlMaster=auto -o ControlPersist=60" 

$ssh_conn [email protected] 

ControlPath=~/.ssh/master-$$ устанавливает путь управления для подключения SSH ControlMaster=auto позволяет сеанс соединения для совместного использования с помощью ControlPath ControlPesist=60 устанавливает количество времени на соединение должно оставаться открытым из-за неактивности

+0

Где было бы лучшее место для установки ssh-ключа, который я использую? – onassar

+0

@onassar Я не совсем уверен, что понимаю ваш вопрос? ssh ключи не должны быть затронуты этим ... –

+1

Позвольте мне предложить ваше предложение – onassar

7

Я предпочитаю метод, описанный в Labs Puppet https://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

Добавьте эти строки в ~/.ssh/config и запустить mkdir ~/.ssh/sockets

Host * 
    ControlMaster auto 
    ControlPath ~/.ssh/sockets/%[email protected]%h-%p 
    ControlPersist 600 

Читайте полный пост блога для более полезной информации о том, что они делают и идиосинкразии SSH при использовании, как это. Я настоятельно рекомендую прочитать блог, или вы можете обнаружить, что все работает не так, как вы ожидаете.

Смежные вопросы