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

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

Предположим, что у меня есть приложение, работающее на одном ПК, которое отправляет команды через SSH на другой ПК в сети (обе машины работают под управлением Linux).

Например, каждый раз, когда что-то происходит на #1, я хочу запустить задачу на #2. В этой настройке мне нужно создать SSH-соединение для каждой команды.

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

решение1

Не уверен, можно ли это использовать в продакшене, но можно сделать что-то вроде этого:

создать файл на #1

1>touch /tmp/commands

Затем выполните команду:

1>tail -f /tmp/commands | ssh [email protected]

Это откроет файл /tmp/commands и начнет отправлять его содержимое на сервер xxxx (#2) и запускать его там построчно.

теперь, каждый раз, когда что-то происходит в #1, делайте:

1>echo "ls -l" >> /tmp/commands

или

1>echo "reboot" >> /tmp/commands

Все, что вы добавите в файл /tmp/commands, будет отправлено в #2 и выполнено. Просто убедитесь, что вы не запускаете ничего интерактивного, или как-то с этим справитесь.

решение2

Автоматическое сохранение с использованием 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

Привет, несоно

решение3

В /etc/ssh/ssh_configдополнения

# Send keep alive signal to remote sshd
ServerAliveInterval 60

решение4

да, это возможно с трубой:

echo 'echo "hi"' | ssh -i my_private_key tester@host2

это выполнит команду echo "hi" на хосте2

вам просто нужно написать программу, которая просто выдает команды (не забудьте ; ), а затем направить этот вывод в ssh

Связанный контент