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