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


9

假设我有一个应用程序正在一台PC上运行,该应用程序通过SSH向网络上的另一台PC(都是运行Linux的计算机)发送命令。

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

是否有任何简单的方法可以使用基本的unix工具来执行此操作而无需对自定义客户端/服务器应用程序进行编程?基本上,我想要的只是通过SSH建立连接,然后再发送一个命令。


Answers:


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并执行。只要确保您没有以交互方式运行任何内容,或者以某种方式处理它即可。


这正是我一直在寻找的,非常有创意的解决方案:)
Jakub Arnold 2010年

5
我要补充一点,您应该使用tail -F,它将检测到文件已被替换,因此当文件变大时,您可以擦除它并重新创建一个新文件。
DerfK 2010年

3
或者,@ DerfK mkfifo /tmp/commands应该是更好的解决方案
solotim


18

使用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

Neero,Cheerio


我登录服务器故障只是为了+1投票给您的答案。您的工作了!
卡玛(Karma)2012年

ssh -N在没有远程命令的情况下启动会话,ssh_config中似乎没有相应的选项。
Jokester

2

/etc/ssh/ssh_config添加

# Send keep alive signal to remote sshd
ServerAliveInterval 60

2

如果您经常遇到这种情况,请尝试Parallel。它像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,在本地计算机和server2上每个CPU内核运行一个进程:

  parallel --trc {.}.ogg -j+0 -S server2,: \
  'mpg321 -w - {} | oggenc -q0 - -o {.}.ogg' ::: *.mp3

0

是的,可以使用管道:

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

这将在host2上执行命令echo“ hi”

您只需要编写一个程序,就可以发出命令(不要忘记;),然后将输出通过管道传递给ssh


0

您可能想要使用像dsh(Distributed SHell)这样的程序来完成该操作:),在为它配置了主机名并设置了publickeya auth之后,可以使用它在多台机器上依次运行命令(“ run在计算机a上运行,然后在计算机b“上运行)或并行运行(”在所有计算机上同时运行“)。或者只是制作脚本

#!/bin/sh
ssh machine -- $@
exec $@

0

免责声明:我现在无法测试,因为我使用的是具有bash但没有ssh的Windows机器。

在bash脚本中,您可以执行以下操作:

exec 4> >(ssh --ssh-options-here user@host)

然后发送命令,将其写入FD 4。

echo 'echo hi' >&4

如果以这种方式进行操作,将无法轻松访问命令的结果,但是根据您的问题,似乎并不需要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.