Гид по технологиям

Запуск локальных скриптов на удалённых серверах через SSH

8 min read DevOps Обновлено 14 Dec 2025
Запуск локальных скриптов на удалённых серверах
Запуск локальных скриптов на удалённых серверах

Ноутбук на синем фоне с открытой командной строкой Linux.

Быстрые ссылки

  • Удалённые подключения

  • Подключения без пароля по SSH

  • Запуск локального скрипта на удалённом сервере

  • Передача аргументов в скрипт

  • Запуск участка скрипта удалённо

  • Расширение возможностей

Зачем запускать локальные скрипты удалённо

Автоматизация рутинных задач экономит время администратора. Когда у вас много серверов, держать копии каждого скрипта на каждом хосте неудобно: нужно обновлять каждую копию вручную и контролировать версии. Запуская скрипты из локальной копии через SSH, вы храните единую актуальную версию и применяете её последовательно на всех серверах.

Классический сценарий — вы редактируете скрипт локально, тестируете его и затем один командой запускаете на нужных удалённых хостах. Bash и SSH дают для этого простые, надёжные инструменты.

Удалённые подключения

Администрирование по сети чаще всего осуществляется через защищённый shell — SSH. SSH предоставляет интерактивную оболочку удалённого сервера, где можно выполнять системные команды и запускать скрипты. Для автоматизированного запуска локальных скриптов по SSH потребуется:

  • SSH-демон (sshd) запущен на удалённом сервере.
  • У вас есть учётная запись на удалённом сервере.

Если вы уже подключаетесь к удалённым серверам вручную, эти условия, как правило, уже выполнены.

Подключения без пароля по SSH

Для массового применения удобно настроить подключение без ввода пароля, используя пару SSH-ключей. Генерация пары ключей и установка публичного ключа на сервер позволяют подключаться безопасно и без запроса пароля.

Простой процесс:

  1. На локальной машине создайте ключи:
ssh-keygen
  1. Установите публичный ключ на удалённом сервере:
ssh-copy-id dave@fedora-36.local
  1. Теперь подключение по SSH будет использовать ключи и не требовать пароля:
ssh dave@fedora-36.local

Важно: ключи удобны, но требуют защиты приватного ключа и аккуратной настройки прав доступа на каталоге ~/.ssh и файле authorized_keys.

Полезное определение:

  • SSH-ключи — криптографические пары (приватный + публичный), используемые для аутентификации без пароля.

Запуск локального скрипта на удалённом сервере

Дальше — практика. Для примера у нас удалённый сервер с именем fedora-36.local и учётной записью dave. Сценарий простой: скрипт записывает текущую метку времени в файл timestamp.txt на удалённом сервере.

Создайте на локальной машине файл local.sh со следующим содержимым и сделайте его исполняемым:

#!/bin/bash

date >> timestamp.txt

exit 0

Разрешение:

chmod +x local.sh

Запускаем скрипт на удалённом сервере, передавая его содержимое через stdin в bash на сервере:

ssh dave@fedora-36.local 'bash -s' < local.sh

Разбор по частям:

  • ssh dave@fedora-36.local — устанавливает соединение.
  • ‘bash -s’ — указывает удалённой bash читать команды из стандартного ввода (stdin).
  • < local.sh — перенаправление локального файла в stdin ssh-сессии.

После выполнения вы вернётесь в командную строку локальной машины. На удалённом сервере можно проверить файл:

cat timestamp.txt

Вы увидите добавленные метки времени. Таким образом, локальный файл local.sh выполнился на удалённом хосте без копирования файла в файловую систему удалённого сервера.

Содержимое файла timestamp.txt после нескольких запусков скрипта

Замечание: в некоторых устаревших системах скрипт может завершиться, но SSH-соединение оставаться открытым; поэтому полезно явно завершать скрипт командой exit 0.

Передача аргументов в скрипт

Если скрипт принимает параметры, их можно передать через командную строку SSH. Пример скрипта local2.sh принимает три параметра и записывает их в timestamp.txt вместе с датой:

#!/bin/bash

echo "$1 $2 $3" >> timestamp.txt

date >> timestamp.txt

exit 0

Запуск с передачей аргументов:

ssh dave@fedora-36.local "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "Articles"

Пояснения:

  • Двойные дефисы – прекращают обработку параметров для ssh и говорят, что всё, что следует дальше, предназначено для скрипта.
  • Параметры указываются после перенаправления stdin, как обычно для bash.
  • В параметре с пробелом мы использовали экранирование пробела обратным слешем: How-To\ Geek.

Проверка на удалённом сервере:

cat timestamp.txt

Проверка приёма параметров и их обработки удалённым сервером

Совет: используйте кавычки и экранирование аккуратно. Если параметры содержат специальные символы, их стоит экранировать или передавать в виде переменных окружения.

Запуск участка скрипта удалённо

Если ваш локальный скрипт выполняет часть локальной логики и затем должен выполнить блок команд на удалённом хосте, удобно использовать here-документы (here-docs). Они позволяют перенаправить метку с набором команд в stdin ssh-сессии.

Пример local3.sh:

#!/bin/bash

# локальная обработка может быть выполнена здесь

# удалённая обработка выполняется ниже

ssh -T dave@fedora-36.local << _remote_commands

# команды, выполняемые удалённо

cd /home/dave/Documents

# и т.д.

# в конце обновляем файл меток времени

echo "Script3.sh:" $(date) >> /home/dave/timestamp.txt

# это метка, которая завершает перенаправление

_remote_commands

# здесь можно продолжить локальную обработку

exit 0

Мы используем опцию -T, чтобы отключить выделение псевдотерминала. Это важно, когда вы не ожидаете интерактивного ввода на удалённом хосте.

Особенности here-документа:

  • Если вы используете необрамлённую метку (например, _remote_commands без кавычек), оболочка локально будет подставлять значения переменных и выполнять расширения перед отправкой на удалённый хост.
  • Чтобы предотвратить локальное расширение (и передать точный текст), используйте кавычки в метке: << ‘EOF’ или <<\’EOF\’. Тогда переменные и подстановка команд останутся неразвёрнутыми до исполнения на удалённом сервере.

Запуск:

./local3.sh

Проверка:

cat timestamp.txt

Запись метки времени от script3.sh в timestamp.txt на удалённом сервере

Частые ошибки и когда это не сработает

  • Отсутствие SSH-демона на сервере (sshd не запущен).
  • Неправильные права на ~/.ssh или на приватный ключ — SSH откажет в аутентификации.
  • Фаервол или сетевые политики блокируют подключение по порту 22 или по нестандартному порту.
  • На удалённом хосте отсутствует bash или shell отличается (например, sh с ограниченным функционалом) — в таком случае вызов “bash -s” не сработает.
  • Скрипт ожидает интерактивного ввода (read, sudo без конфигурации), и соединение завершится ошибкой.
  • Большие бинарные или двоичные данные: передача через stdin может быть неочевидна; лучше использовать scp/rsync или ответственные средства доставки.

Если что-то не работает: проверьте ssh -v для детальной диагностики, убедитесь в наличии сетевого доступа и корректности ключей.

Альтернативные подходы

  • scp или rsync: скопировать скрипт на сервер и запустить через ssh. Удобно, если скрипт нужно оставить на сервере.
  • Ansible, Salt, Fabric: инструменты управления конфигурацией и удалённым выполнением, которые масштабируют операции на сотни хостов и дают идемпотентность и отчётность.
  • systemd-run или cron: если нужно регулярно запускать задачу на удалённом хосте, можно скопировать и поставить задачу в расписание.
  • SSHFS: подключить удалённую директорию и запускать локальные скрипты прямо из неё (бывает медленнее и привязывает вас к сетевому файловому доступу).

Выбор зависит от цели: одноразовый запуск, массовое развертывание или постоянная оркестрация.

Модель мышления и эвристики

  • Минимизируйте доверие к удалённому коду: не запускать произвольные скрипты без проверки.
  • Разделяйте локальную логику и удалённые действия: соберите данные локально, а примитивные команды выполняйте на удалённом хосте.
  • Думайте идемпотентно: скрипты, которые можно выполнять несколько раз без побочных эффектов, легче автоматизировать.
  • Логи и обратная связь: всегда записывайте результат выполнения на удалённом хосте или возвращайте коды состояния для централизованного логирования.

Меры безопасности

  • Ограничьте команды, доступные ключам в файле authorized_keys, добавляя опции перед ключом, например:
command="/usr/local/bin/limited-wrapper.sh",no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2E...
  • Разрешите доступ только с конкретных IP при помощи firewall или в рамках политики SSH Match.
  • Используйте отдельные ключи для разных задач и ротацию ключей.
  • Не используйте пересылку агента (agent forwarding) на ненадёжных хостах — это даёт удалённому хосту возможность использовать ваш агент.
  • Если скрипт требует повышенных прав, избегайте запуска sudo без пароля. Лучше внедрить привилегии через более контролируемые механизмы (например, sudo с ограничением команд).

Практические сниппеты и подсказки

  • Запуск скрипта и получение вывода в реальном времени:
ssh -t dave@fedora-36.local 'bash -s' < local.sh
  • Скопировать скрипт и запустить его удалённо (двухшаговый метод):
scp local.sh dave@fedora-36.local:/tmp/local.sh
ssh dave@fedora-36.local 'bash /tmp/local.sh && rm /tmp/local.sh'
  • Передача переменных окружения в скрипт:
MYVAR=value ssh dave@fedora-36.local 'bash -s' < local.sh

(Учтите, что переменные в этом случае будут доступны на удалённом хосте, но некоторые оболочки могут вести себя по-разному при экспорте.)

  • Here-doc, предотвращающий локальное расширение переменных:
ssh dave@fedora-36.local 'bash -s' <<'EOF'

echo "$HOME"   # будет расширено на удалённом хосте

EOF
  • Передача двоичных данных: используйте tar через stdin/stdout:
tar -czf - some/dir | ssh dave@host 'tar -xzf - -C /target/dir'

Контроль приёма и тесты

Критерии приёмки для простого сценария записи timestamp.txt:

  • Скрипт исполняется без запроса пароля (при настроенных ключах).
  • Файл /home/dave/timestamp.txt на удалённом хосте обновлён с новой меткой времени.
  • Код выхода команды ssh равен 0 при успешном выполнении.
  • Логи в /var/log/auth.log (или еквивалентные) не содержат ошибок аутентификации.

Примеры тест-кейсов:

  1. Запуск без передачи аргументов — в timestamp.txt появляется только дата.
  2. Запуск с аргументами — timestamp.txt содержит переданные строки и дату.
  3. Отсутствие доступа по ключам — ssh возвращает код ошибки; лог содержит причину.
  4. Скрипт с интерактивным read — выполнение блокируется; нужно либо обеспечить ввод, либо избегать интерактивности.

Руководство действий (SOP) для безопасного запуска локальных скриптов на проде

  1. Разработать и протестировать скрипт локально в тестовой среде.
  2. Пройти ревью кода (как минимум один коллега).
  3. Настроить отдельный непарольный ключ для автоматизации и установить его на целевых серверах.
  4. Ограничить ключ параметром command в authorized_keys, если задача фиксирована.
  5. Запустить скрипт на одном тестовом сервере и проверить результаты.
  6. Собрать логи и убедиться в отсутствии побочных эффектов.
  7. Развернуть на остальных серверах частями, отслеживая метрики и логи.
  8. По завершении удалить временные файлы и при необходимости отозвать ключ.

Совместимость и миграция

  • Bash и POSIX-совместимые sh сценарии обычно работают на большинстве Linux-дистрибутивов. На системах с dash или BusyBox проверьте используемые конструкции.
  • На Windows можно использовать OpenSSH (в составе современных версий Windows) или WSL: в WSL подход с ‘bash -s’ будет работать как на Linux.
  • Если целевые хосты сильно разные (Solaris, AIX), проверьте наличие и поведение bash, дат и других утилит.

Мерчантс (сравнение подходов)

  • Один линк: ‘ssh bash -s < script’ — удобно, не сохраняет файл, быстрый для одноразовых задач.
  • SCP + ssh ‘bash файл’ — создаёт временную копию, удобнее если нужен persistent файл.
  • Ansible — управление сотнями хостов, декларативность, идемпотентность.

Выбор зависит от масштаба и требований управления конфигурацией.

Дерево решений

flowchart TD
  A[Нужно запустить скрипт удалённо?] --> B{Сколько хостов?}
  B -->|1–5| C[Использовать ssh 'bash -s' < script]
  B -->|6–100| D[Рассмотреть scp + ssh или Fabric]
  B -->|>100| E[Использовать Ansible/Salt/Chef/Puppet]
  C --> F{Нужен доступ без пароля?}
  F -->|да| G[Настроить SSH-ключи]
  F -->|нет| H[Использовать временный пароль или настроить ключи]

Резюме

Запуск локальных скриптов на удалённых серверах через SSH — простой и гибкий способ управлять несколькими машинами, не копируя файлы вручную. Комбинация SSH-ключей, “bash -s”, here-документов и аккуратного обращения с привилегиями позволяет построить безопасную и воспроизводимую процедуру деплоя и выполнения автоматизированных задач.

Важные замечания

  • Всегда проверяйте скрипты в тестовой среде и применяйте принцип наименьших привилегий.
  • При масштабировании рассмотрите инструменты управления конфигурацией для удобства, отчётности и идемпотентности.

Краткое итоговое резюме:

  • Настройте SSH-ключи для безпарольного доступа.
  • Используйте ssh dave@host ‘bash -s’ < local.sh для исполнения локальной копии на удалённом хосте.
  • Для блоков команд используйте here-документы.
  • Примите меры безопасности: ограничивайте ключи, логируйте выполнение и тестируйте тщательно.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как распознать и избежать консольных скальперов
Геймеры

Как распознать и избежать консольных скальперов

Жесты для сенсорных Chromebook
Руководство

Жесты для сенсорных Chromebook

Как создать общую папку VirtualBox в Windows 11
VirtualBox

Как создать общую папку VirtualBox в Windows 11

Ошибка 500120309 в приложении Southwest — как исправить
Технологии

Ошибка 500120309 в приложении Southwest — как исправить

Шифрование домашней папки в Ubuntu
Безопасность

Шифрование домашней папки в Ubuntu

Как добавить alt-текст в Twitter
Доступность

Как добавить alt-текст в Twitter