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