Вопрос или проблема
В настоящее время я вызываю следующее:
$ ssh [email protected] my_cmd
Это медленно и не просто автоматизировать безопасно. Я бы хотел установить ssh-соединение один раз и иметь скрипт, который будет пересылать мои команды на host.com и выводить результат.
Это возможно?
Добавление моей машины в authorized_keys не является для меня вариантом, и это не решит проблему медлительности.
Эта функция называется ControlMaster
, которая обеспечивает мультиплексирование по одному существующему каналу. Это позволяет ssh выполнять все обмены ключами и вход только один раз; таким образом, последующие команды будут выполняться значительно быстрее. Вы активируете это, используя эти три строки в вашем .ssh/config
:
Host host.com
ControlMaster auto
ControlPath ~/.ssh/master-%C
# для openssh < 6.7 вам нужно использовать это:
# ControlPath ~/.ssh/master-%r@%h-%p
ControlPersist 5m
Вы можете настроить это под свои нужды; одним из альтернативных вариантов является открытие одного основного соединения, которое останется открытым во время выполнения ваших других команд; тогда вам не потребуется ControlPersist
.
С этой функцией есть много возможностей для настройки, но убедитесь, что вы храните свой ControlPath
сокет в безопасном месте, недоступном для других пользователей, иначе его можно будет неправомерно использовать.
Больше информации можно найти в строке справки ssh_config(5)
.
Если вы контролируете машину до такой степени, что автоматизируете задачи на ней, тогда почему добавление вашего ключа в authorized_keys не является вариантом?
ssh-copy-id -i ~/.ssh/foo [email protected]
Тогда вам не нужно будет вводить пароль каждый раз, когда вы подключаетесь.
Если главная проблема заключается в том, что подключения занимают много времени, вы можете повторно использовать одно соединение, добавив control master
в свой конфигурационный файл ssh. Оставьте это одно соединение открытым, и все последующие подключения будут практически моментальными.
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600
https://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections
В долгосрочной перспективе, если вы автоматизируете задачи, вероятно, лучше использовать платформу автоматизации, которая выполняет установку соединения за вас, например:
Ответ или решение
Для поддержания открытого соединения SSH и использования его из shell-скриптов существует несколько подходов, которые значительно ускоряют процесс выполнения команд на удаленном сервере. Одним из самых эффективных методов является использование функцией ControlMaster
, которая позволяет осуществлять мультиплексирование по одному существующему каналу. В результате, последующие команды выполняются гораздо быстрее, так как повторная аутентификация и обмен ключами не проводятся.
Настройка SSH для мультиплексирования
Для настройки мультиплексирования SSH выполните следующие шаги:
-
Редактирование конфигурационного файла SSH:
Откройте файл конфигурации SSH, который обычно находится по пути~/.ssh/config
. Если он не существует, вы можете создать его.nano ~/.ssh/config
-
Добавление настроек хоста:
Вставьте следующий код в файл конфигурации. Следует заменитьhost.com
на адрес вашего удаленного хоста.Host host.com ControlMaster auto ControlPath ~/.ssh/master-%C ControlPersist 5m
ControlMaster auto
: включает автоматическое использование многопоточности.ControlPath ~/.ssh/master-%C
: указывает путь для хранения сокета управления соединением.%C
будет заменён на уникальный идентификатор соединения.ControlPersist 5m
: удерживает соединение открытым в течение 5 минут после закрытия внешних сессий. Вы можете настроить это значение в зависимости от ваших потребностей.
-
Создание папки для сокетов:
Убедитесь, что указанная вами директория дляControlPath
существует:mkdir -p ~/.ssh
-
Проверка прав доступа:
Убедитесь, что доступ к папке с сокетами ограничен, чтобы избежать возможности несанкционированного доступа:chmod 700 ~/.ssh
Использование открытого соединения из скриптов
После настройки конфигурации SSH вы можете запускать ваши команды в shell-скриптах, используя уже установленное основное соединение. Пример простого скрипта, который выполняет команды на удаленном хосте:
#!/bin/bash
# Установите соединение (первая команда, она будет медленной)
ssh host.com "echo 'Соединение установлено!'"
# Выполнение последующих команд будет быстрее
ssh host.com "ls -la"
ssh host.com "uptime"
Этот скрипт сначала устанавливает соединение и подтверждает его, а затем выполняет несколько команд, используя уже установленное соединение.
Альтернативные решения для автоматизации
Если ваши задачи предполагают регулярные автоматизированные задания, рассмотрите возможность использования инструментов управления конфигурациями и автоматизации, таких как:
- Ansible: мощный инструмент для автоматизации с управлением серверной конфигурацией.
- Puppet: ещё один надежный инструмент для управления серверной конфигурацией.
- Rundeck: платформа для автоматизации операций и управления заданиями.
Эти инструменты могут значительно упростить ваши процессы автоматизации и управления, исключив необходимость постоянного взаимодействия с SSH напрямую.
Заключение
Запрос на ускорение выполнения команд через SSH может быть успешно решён с помощью настройки мультиплексирования ControlMaster
. Это не только ускоряет процесс, но и делает его более удобным для автоматизированного выполнения задач. Если возможности добавления ключа в authorized_keys
отсутствуют, использование описанного метода значительно упростит вашу работу.