如何在一段时间内创建持久的 SSH 连接来“流式传输”命令?

如何在一段时间内创建持久的 SSH 连接来“流式传输”命令?

假设我在一台 PC 上运行一个应用程序,该应用程序通过 SSH 向网络上的另一台 PC 发送命令(两台机器都运行 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 自动持久化

您还可以使用ControlMasterOpenSSH 的功能,它为第一次连接打开一个 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

这将在 host2 上执行命令 echo "hi"

你只需要编写一个程序,只给出命令(不要忘记;),然后将该输出通过管道传输到 ssh

相关内容