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

Jak*_*old 10 linux ssh

假设我在一台 PC 上运行了一个应用程序,它通过 SSH 向网络上的另一台 PC(两台运行 Linux 的机器)发送命令。

例如,每次在#1 上发生某些事情时,我都想在#2 上运行一个任务。在这个设置中,我必须在每个命令上创建 SSH 连接。

有没有什么简单的方法可以使用基本的 unix 工具来做到这一点,而无需编写自定义客户端/服务器应用程序?基本上我想要的只是通过 SSH 建立连接,然后一个接一个地发送命令。

nes*_*ono 21

使用 OpenSSH 的自动持久性

您还可以使用ControlMasterOpenSSH的功能,它为第一次连接打开一个 unix 域套接字,并在所有后续调用中重用此连接。

要启用该功能,您可以-M用作命令行开关或ControlMaster在您的 中启用该选项~/.ssh/ssh_config,例如:

ControlMaster auto
Run Code Online (Sandbox Code Playgroud)

此外,您应该ControlPath在您的~/.ssh/ssh_config:

Host *
   ControlPath ~/.ssh/master-%r@%h:%p
Run Code Online (Sandbox Code Playgroud)

为了保持与主机的持久连接,例如,如果您想运行一个脚本,该脚本需要与主机建立许多 ssh 连接,而这些连接在脚本的整个生命周期内都不是持久的,您可以使用以下命令提前启动静默连接:

ssh -MNf remotehost
Run Code Online (Sandbox Code Playgroud)

Cheerio, nesono


Vit*_*aev 12

不确定它是否可以用于生产,但您可以执行以下操作:

在 #1 上创建文件

1> touch /tmp/commands

然后运行命令:

1> tail -f /tmp/commands | ssh username@x.x.x.x

这将打开文件 /tmp/commands 并开始将其内容发送到服务器 xxxx (#2) 并在那里逐行运行

现在,每次 #1 发生某些事情时,请执行以下操作:

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

或者

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

您添加到文件 /tmp/commands 的任何内容都将发送到 #2 并执行。只要确保你没有运行任何交互式的东西,或者以某种方式处理它。

  • 我想补充一点,你应该使用`tail -F`,它会检测到文件已被替换,所以当它变得很大时,你可以删除它并重新开始一个新文件。 (5认同)
  • @DerfK,或者,`mkfifo /tmp/commands` 应该是更好的解决方案 (3认同)