Назад | Перейти на главную страницу

Как я могу создать постоянное SSH-соединение для «потоковых» команд в течение определенного периода времени?

Скажем, у меня есть приложение, работающее на одном ПК, которое отправляет команды через 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

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