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

Как поделиться / сохранить соединение SSH из сценария оболочки, который запускает несколько команд

У меня есть сценарий оболочки, который подключается через SSH к тому же хосту (мой-сервер) и запускает множество команд, смешанных по всему сценарию. Например:

ssh -o ConnectTimeout=3 -o ConnectionAttempts=3 user@my-server "foocommand here"

mkdir -p /path/here
touch service.conf
...

ssh -o ConnectTimeout=3 -o ConnectionAttempts=3 user@my-server "barcommand here"

mkdir -p /other/path/here
touch /other/path/here/service.conf
...

ssh -o ConnectTimeout=3 -o ConnectionAttempts=3 user@my-server "darcommand here"

И так далее. Проблема в том, что каждое соединение SSH открыто, и рукопожатие занимает немного времени, так как сервер my-server географически далеко от работающего скрипта.

Есть ли способ ускорить этот процесс и предотвратить открытие нового SSH-соединения для каждой требуемой команды? Что-нибудь вроде http keep alive для SSH?

Да, вы можете настроить ssh для постоянного подключения к удаленному серверу. Это делается с помощью ControlMaster, ControlPath и ControlPersist параметры.

Образец конфигурации (разместить в $HOME/.ssh/config):

ControlMaster auto
ControlPath ~/.ssh/sockets/%C
ControlPersist 600

Настройка ControlPath позволяет совместное использование соединения; пока открыто ssh-соединение с удаленным хостом, другие ssh-соединения с тем же пользователем / хостом будут мультиплексированы через соединение.

Настройка ControlPersist позволяет соединению оставаться активным в течение определенного периода времени после выхода из последнего сеанса ssh.

Настройка ControlMaster к auto позволяет ssh повторно использовать существующее соединение или при необходимости создать новое соединение.

Увидеть ssh_config(5) страницу руководства для подробного объяснения этих опций.