Скажем, у меня на одном ПК запущено приложение, которое отправляет команды через SSH на другой ПК в сети (обе машины работают под управлением Linux).
Например, каждый раз, когда что-то происходит на # 1, я хочу запустить задачу на # 2. В этой настройке я должен создать соединение SSH для каждой команды.
Есть ли простой способ сделать это с помощью основных инструментов Unix без программирования пользовательских клиент-серверных приложений? По сути, все, что я хочу, это установить соединение по SSH, а затем отправлять одну команду за другой.
Ответы:
Не уверен, что это можно использовать в производстве, но вы можете сделать что-то вроде этого:
создать файл на # 1
1>
touch /tmp/commands
Затем выполните команду:
1>
tail -f /tmp/commands | ssh username@x.x.x.x
Это откроет файл / tmp / команды и начнет отправлять его содержимое на сервер xxxx (# 2) и будет запускать его там построчно
теперь каждый раз, когда что-то случается на # 1, делайте:
1>
echo "ls -l" >> /tmp/commands
или
1>
echo "reboot" >> /tmp/commands
все, что вы добавите в файл / tmp / команды, будет отправлено на # 2 и выполнено. Просто убедитесь, что вы не запускаете ничего интерактивного или как-то с этим справляетесь.
источник
tail -F
, который обнаружит, что файл был заменен, поэтому, когда он станет гигантским, вы можете стереть его и начать заново с новым файлом.mkfifo /tmp/commands
должно быть лучшим решениемАвтоматическая устойчивость с использованием OpenSSH
Вы также можете использовать
ControlMaster
функцию OpenSSH, которая открывает сокет домена unix для первого соединения и повторно использует это соединение во всех последующих вызовах.Чтобы включить эту функцию, вы можете либо использовать ее
-M
в качестве переключателя командной строки, либо включить этуControlMaster
опцию~/.ssh/ssh_config
, например:Кроме того, вы должны установить
ControlPath
следующие строки~/.ssh/ssh_config
:Чтобы поддерживать постоянное соединение с хостом, например, если вы хотите запустить скрипт, который должен установить множество соединений ssh с хостом, ни одно из которых не является постоянным в течение всего времени существования скрипта, вы можете заранее запустить автоматическое соединение, используя:
Привет, Несоно
источник
ssh -N
запускает сеанс без удаленной команды, кажется, нет соответствующих параметров в ssh_config.В
/etc/ssh/ssh_config
добавленииисточник
Если вы часто сталкиваетесь с подобными вещами, попробуйте Parallel . Он похож на dsh (распределенная оболочка), но имеет некоторые полезные функции, такие как подсчет семафоров, и он активно поддерживается.
Из документации:
ПРИМЕР: GNU Parallel как система очередей / менеджер пакетов
GNU Parallel может работать как простая система очередей заданий или как менеджер пакетов. Идея состоит в том, чтобы поместить задания в файл и постоянно читать из него GNU Parallel. Поскольку GNU Parallel остановится в конце файла, мы используем tail для продолжения чтения:
Чтобы отправить свои работы в очередь:
Конечно, вы можете использовать -S для распределения заданий на удаленные компьютеры:
Есть много замечательных примеров, которые просто царапают поверхность. Вот крутой.
ПРИМЕР: Распределение работы на локальные и удаленные компьютеры
Преобразуйте * .mp3 в * .ogg, запустив один процесс на ядро ЦП на локальном компьютере и сервере2:
источник
да можно с трубкой
это выполнит команду echo "hi" на host2
вам просто нужно написать программу, которая просто выдает команды (не забывайте;) и затем направляет вывод в ssh
источник
Возможно, вы захотите использовать такую программу, как dsh (Distributed SHell), которая предназначена именно для этого :). После настройки ее с именами хостов и настройки аутентификации publickeya вы можете использовать ее для запуска команд на нескольких компьютерах либо последовательно ("run на машине a, затем запустите на машине b ") или в pararell (" запустите на всех машинах одновременно "). Или просто сделайте сценарий
источник
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не могу проверить это сейчас, так как я на Windows-машине с bash, но без ssh.
В скрипте bash вы можете сделать что-то вроде этого:
А затем для отправки команд запишите их в FD 4.
Если вы делаете это таким образом, вы не можете легко получить доступ к результатам команд, но, исходя из вашего вопроса, это не похоже на то, что вам нужно.
источник