Как я могу поддерживать открытое ssh-соединение и использовать его в shell-скриптах?

Вопрос или проблема

В настоящее время я вызываю следующее:

$ 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 выполните следующие шаги:

  1. Редактирование конфигурационного файла SSH:
    Откройте файл конфигурации SSH, который обычно находится по пути ~/.ssh/config. Если он не существует, вы можете создать его.

    nano ~/.ssh/config
  2. Добавление настроек хоста:
    Вставьте следующий код в файл конфигурации. Следует заменить host.com на адрес вашего удаленного хоста.

    Host host.com
     ControlMaster auto
     ControlPath ~/.ssh/master-%C
     ControlPersist 5m
    • ControlMaster auto: включает автоматическое использование многопоточности.
    • ControlPath ~/.ssh/master-%C: указывает путь для хранения сокета управления соединением. %C будет заменён на уникальный идентификатор соединения.
    • ControlPersist 5m: удерживает соединение открытым в течение 5 минут после закрытия внешних сессий. Вы можете настроить это значение в зависимости от ваших потребностей.
  3. Создание папки для сокетов:
    Убедитесь, что указанная вами директория для ControlPath существует:

    mkdir -p ~/.ssh
  4. Проверка прав доступа:
    Убедитесь, что доступ к папке с сокетами ограничен, чтобы избежать возможности несанкционированного доступа:

    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 отсутствуют, использование описанного метода значительно упростит вашу работу.

Оцените материал
Добавить комментарий

Капча загружается...