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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ssh-keygen

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

ssh-copy-id [email protected]

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

ssh [email protected]

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

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

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

#!/bin/bash

date >> timestamp.txt

exit 0

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

chmod +x local.sh

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

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

ssh [email protected] 'bash -s' < local.sh

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

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

  • ssh [email protected]: SSH-соединение, которое мы устанавливаем с удаленной машиной. Для этого используется команда ssh, существующая учетная запись пользователя на удаленном сервере и адрес удаленного сервера.
  • ‘bash -s’: Заставляет Bash читать команды из стандартного потока ввода.
  • < local.sh: Мы переадресуем скрипт в Bash.

После выполнения скрипта мы возвращаемся в командную строку локальной машины. Перейдя на удаленную машину, мы можем использовать 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 [email protected] "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "Articles"

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

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

cat timestamp.txt

Удаленное выполнение фрагмента скрипта

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

Мы можем добиться этого с помощью here documents. Here documents позволяют перенаправлять строки из помеченного раздела скрипта в команду. Локальная обработка может выполняться выше и ниже here document.

Это скрипт «local3.sh», который содержит here document.

#!/bin/bash

# local processing can done here

# remote processing is done here
ssh -T [email protected] << _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

Расширьте сферу своего влияния

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