Поиск по сайту:

Как запустить локальный скрипт на удаленном сервере Linux


Сценарии повторяющихся задач повышают эффективность системного администрирования. Это отлично подходит для локальных компьютеров, но что, если вы контролируете удаленные серверы? Можно ли запустить локальный скрипт на удаленном компьютере? Да!

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

Удаленное системное администрирование обычно включает в себя подключение к удаленному компьютеру через защищенное соединение shellell. Соединение SSH предоставляет вам командную строку на удаленном компьютере. Затем вы можете продолжить и выполнить любое необходимое обслуживание системы.

Сценарии оболочки помогают, позволяя вам обернуть последовательность команд в сценарий, который можно запустить, как если бы они были программой, объединяя множество действий в одну инструкцию командной строки.

Со временем вы будете настраивать и улучшать свои сценарии. Если у вас есть много удаленных компьютеров для администрирования, поддержание копии каждого скрипта на каждом сервере в актуальном состоянии — это проблема и утомительные накладные расходы. Это само по себе становится административной задачей и съедает экономию времени, которую должно обеспечить использование сценариев.

Идеальное решение позволит вам хранить свои скрипты на локальном компьютере и запускать их на удаленных компьютерах через SSH-соединение. Это упростило бы управление с помощью централизованного набора скриптов, и один и тот же актуальный скрипт запускается на всех компьютерах.

Bash и SSH предоставляют способ сделать именно это.

Беспарольные SSH-соединения

Лучший способ сделать это — подключиться без пароля, используя ключи SSH. Генерируя SSH-ключи на локальном компьютере и отправляя их на каждый из удаленных компьютеров, вы можете безопасно и удобно подключаться к удаленным компьютерам без необходимости каждый раз вводить пароль.

Хотя они могут пугать начинающих пользователей, ключи SSH на самом деле не сложны. Их легко сгенерировать, просто установить на удаленных серверах и без проблем использовать с SSH. Единственным предварительным условием является то, что на удаленных компьютерах должен быть запущен демон SSH sshd и что у вас есть учетная запись пользователя на удаленном компьютере.

Если вы уже выполняете на них удаленное системное администрирование, оба этих требования уже должны быть выполнены.

Чтобы сгенерировать пару ключей SSH, введите:

ssh-keygen

Если у вас есть учетная запись с именем «dave» на компьютере с именем «fedora-36.local», вы можете отправить и установить на нее свой открытый ключ SSH с помощью этой команды:

ssh-copy-id dave@fedora-36.local

Теперь при обычном подключении SSH будет выполняться аутентификация с использованием ключей SSH. Вы попадаете в командную строку на удаленном сервере без запроса пароля.

ssh dave@fedora-36.local

Удаленный запуск локального скрипта

Для этих тестов нашим удаленным сервером является компьютер с Linux под названием «fedora-36.local». Мы настроили ключи SSH и протестировали беспарольное подключение к удаленному серверу с нашего локального компьютера.

Наш сценарий очень прост. Он записывает метку времени в файл с именем «timestamp.txt» на удаленном сервере. Обратите внимание, что сценарий завершается командой выхода. Это важно, в некоторых старых системах сценарий может выполняться до конца, но соединение SSH остается открытым.

#!/bin/bash

date >> timestamp.txt

exit 0

Скопируйте этот текст в редактор, сохраните его как «local.sh», а затем используйте chmod, чтобы сделать его исполняемым.

chmod +x local.sh

На нашей локальной машине мы запустим скрипт следующим образом:

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

Вот как это работает.

  • ssh dave@fedora-36.local: SSH-подключение, которое мы устанавливаем к удаленному компьютеру. При этом используется команда ssh, уже существующая учетная запись пользователя на удаленном сервере и адрес удаленного сервера.
  • 'bash -s': это заставляет Bash считывать команды из стандартного потока ввода. Он позволяет Bash читать перенаправленный или переданный по конвейеру ввод.
  • < local.sh: мы перенаправляем скрипт в Bash.

Когда скрипт запускается, мы возвращаемся в командную строку локальной машины. Перейдя на нашу удаленную машину, мы можем использовать cat для просмотра файла «timestamp.txt».

cat timestamp.txt

Мы можем видеть временную метку последнего и единственного соединения. Запуск локального скрипта еще несколько раз добавляет соответствующие метки времени в удаленный файл.

cat timestamp.txt

Конечно, в реальной ситуации ваш скрипт сделал бы что-то более полезное. Но даже наш тривиальный пример демонстрирует, что локальный скрипт выполняется на удаленном сервере.

Передача аргументов сценарию

Вы можете передать аргументы командной строки скрипту. Мы изменим наш скрипт, чтобы он ожидал три параметра командной строки. Они перенаправляются в файл «timestamp.txt» вместе с меткой времени.

Сохраните этот скрипт как «local2.sh» и сделайте его исполняемым с помощью chmod.

#!/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"

Двойной дефис «--» говорит Bash, что следующее не должно считаться параметрами командной строки для команды ssh. Три параметра сценария, как обычно, следуют за именем сценария. Обратите внимание, что мы использовали обратную косую черту «\», чтобы избежать пробела в параметре «How-To\ Geek».

Мы можем проверить с помощью cat, что наши параметры были получены и правильно обработаны на удаленном сервере.

cat timestamp.txt

Удаленный запуск части скрипта

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

Мы можем добиться этого, используя здесь документы. Здесь документы позволяют нам перенаправлять строки из помеченного раздела скрипта в команду. Локальная обработка может выполняться над и под документом здесь.

Это скрипт «local3.sh», который содержит здесь документ.

#!/bin/bash

# local processing can done here

# remote processing is done here
ssh -T dave@fedora-36.local << _remote_commands

# commands to be run remotely would be added here
cd /home/dave/Documents
# etc.

# Finally, update the timestamp file
echo "Script3.sh:" $(date) >> /home/dave/timestamp.txt

# this is the label that marks the end of the redirection
_remote_commands

# more local processing can be done here

exit 0

Мы используем команду ssh с теми же данными подключения, что и раньше. Мы подключаемся как пользователь «dave» к удаленному серверу с именем «fedora-36.local». Мы также используем параметр -T (отключить выделение псевдотерминала). Это предотвращает предоставление удаленным сервером интерактивного терминала для этого соединения.

За перенаправлением «<» следует название ярлыка. В этом примере мы используем «_remote_commands». В этом ярлыке нет ничего особенного, это просто ярлык.

Все команды, которые появляются в строках, после перенаправления, отправляются через SSH-соединение. Перенаправление останавливается, когда встречается метка. Затем выполнение скрипта продолжается со строки, следующей за меткой.

Давайте запустим наш сценарий смешанной локальной и удаленной обработки.

./local3.sh

Как и ожидалось, мы видим новую запись в файле «timestamp.txt».

cat timestamp.txt

Расширьте охват

Возможность удаленного запуска сценариев, которые записываются, хранятся и обслуживаются локально, обеспечивает удобный инструмент администрирования. Знание того, что одна и та же версия сценария выполняется на всех ваших удаленных серверах, значительно упрощает управление.