Скажем, у меня есть приложение, работающее на одном ПК, которое отправляет команды через SSH на другой компьютер в сети (обе машины работают под Linux).
Например, каждый раз, когда что-то происходит на №1, я хочу запустить задачу на №2. В этой настройке мне нужно создавать SSH-соединение для каждой отдельной команды.
Есть ли простой способ сделать это с помощью основных инструментов unix без программирования пользовательского клиент-серверного приложения? По сути, все, что я хочу, - это установить соединение через SSH, а затем отправлять одну команду за другой.
Автоматическая стойкость с использованием OpenSSH
Вы также можете использовать ControlMaster
функция OpenSSH, которая открывает сокет домена unix для первого соединения и повторно использует это соединение во всех последующих вызовах.
Чтобы включить эту функцию, вы можете использовать -M
в качестве переключателя командной строки или включите ControlMaster
вариант в вашем ~/.ssh/ssh_config
, например:
ControlMaster auto
Кроме того, вы должны установить ControlPath
используя следующие строки в вашем ~/.ssh/ssh_config
:
Host *
ControlPath ~/.ssh/master-%r@%h:%p
Чтобы поддерживать постоянное соединение с хостом, например если вы хотите запустить скрипт, который должен установить множество ssh-соединений с хостом, ни одно из которых не является постоянным в течение всего времени существования скрипта, вы можете запустить тихое соединение заранее, используя:
ssh -MNf remotehost
Cheerio, несоно
Не уверен, что его можно использовать в производстве, но вы можете сделать что-то вроде этого:
создать файл на # 1
1> touch /tmp/commands
Затем запустите команду:
1> tail -f /tmp/commands | ssh username@x.x.x.x
Это откроет файл / tmp / commands и начнет отправлять его содержимое на сервер x.x.x.x (# 2) и запускать его там построчно.
теперь, каждый раз, когда что-то происходит на # 1, сделайте:
1> echo "ls -l" >> /tmp/commands
или
1> echo "reboot" >> /tmp/commands
все, что вы добавляете в файл / tmp /, будет отправлено в # 2 и выполнено. Просто убедитесь, что вы не запускаете ничего интерактивного или как-нибудь с этим не справляетесь.
В /etc/ssh/ssh_config
Добавить
# Send keep alive signal to remote sshd
ServerAliveInterval 60
Если вы часто сталкиваетесь с подобными вещами, попробуйте Параллельный. Он похож на dsh (распределенная оболочка), но имеет некоторые полезные функции, такие как подсчет семафоров, и активно поддерживается.
Из документации:
ПРИМЕР: GNU Parallel как система очередей / пакетный менеджер
GNU Parallel может работать как простая система очереди заданий или как пакетный менеджер. Идея состоит в том, чтобы поместить задания в файл и обеспечить непрерывное чтение из него GNU Parallel. Поскольку GNU Parallel остановится в конце файла, мы используем tail для продолжения чтения:
echo >jobqueue; tail -f jobqueue | parallel
Чтобы отправить вакансию в очередь:
echo my_command my_arg >> jobqueue
Конечно, вы можете использовать -S для распределения заданий на удаленные компьютеры:
echo >jobqueue; tail -f jobqueue | parallel -S ..
Есть много отличных примеров, которые касаются только поверхности. Вот такой классный.
ПРИМЕР: Распределение работы на локальные и удаленные компьютеры
Преобразуйте * .mp3 в * .ogg, выполняя по одному процессу на ядро ЦП на локальном компьютере и сервере2:
parallel --trc {.}.ogg -j+0 -S server2,: \
'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3
да можно с трубкой:
echo 'echo "hi"' | ssh -i my_private_key tester@host2
это выполнит команду echo "hi" на host2
вам просто нужно написать программу, которая просто выдает команды (не забывайте;), а затем направляет этот вывод в ssh
Возможно, вы захотите использовать такую программу, как dsh (Distributed SHell), которая предназначена именно для этого :). После настройки имен хостов и настройки publickeya auth вы можете использовать ее для запуска команд на нескольких машинах либо последовательно ("run на машине a, затем запустите на машине b ») или параллельно (« запустите на всех машинах одновременно »). Или просто сделайте сценарий
#!/bin/sh
ssh machine -- $@
exec $@
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не могу проверить это прямо сейчас, так как я нахожусь на машине с Windows с bash, но без ssh.
В сценарии bash вы можете сделать что-то вроде этого:
exec 4> >(ssh --ssh-options-here user@host)
А затем для отправки команд запишите их в FD 4.
echo 'echo hi' >&4
Если вы сделаете это таким образом, вы не сможете легко получить доступ к результатам команд, но, судя по вашему вопросу, это не похоже на то, что вам нужно.