如何在一段时间内创build持久的SSH连接来“stream”命令?

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

例如,每当#1发生什么事,我想在#2上运行一个任务。 在这个设置中,我必须在每个命令上创buildSSH连接。

有没有简单的方法来做到这一点与基本的UNIX工具没有编程自定义客户端/服务器应用程序? 基本上我只想通过SSHbuild立连接,然后发送一个接一个的命令。

不知道它是否可以在生产中使用,但你可以做这样的事情:

在#1上创build文件

1> touch / tmp /命令

然后运行命令:

1> tail -f / tmp / commands | ssh用户名@ xxxx

这将打开文件/ tmp /命令,并开始将其内容发送到服务器xxxx(#2)并逐行运行

现在,每当#1发生什么事情:

1> echo“ls -l”>> / tmp / commands

要么

1> echo“rebo​​ot”>> / tmp / commands

无论你添加到文件/ tmp /命令将被发送到#2并执行。 只要确保你没有运行任何交互,或以某种方式处理它。

使用OpenSSH自动持久性

您还可以使用OpenSSH的ControlMasterfunction,该function为第一个连接打开一个unix域套接字,并在随后的所有调用中重新使用该连接。

要启用该function,可以使用-M作为命令行开关,或在~/.ssh/ssh_config启用ControlMaster选项,例如:

 ControlMaster auto 

此外,您应该在~/.ssh/ssh_config使用以下行来设置ControlPath

 Host * ControlPath ~/.ssh/master-%r@%h:%p 

要保持与主机的持久连接,例如,如果要运行需要与主机build立多个ssh连接的脚本(在脚本的整个生命周期中都不会持续存在),可以使用以下命令启动无提示连接:

 ssh -MNf remotehost 

Cheerio,nesono

/etc/ssh/ssh_config添加

 # Send keep alive signal to remote sshd ServerAliveInterval 60 

如果遇到这种情况,请尝试Parallel 。 它就像是dsh(分布式shell),但是有一些整洁的function,比如计算信号量,并且被主动维护。

从文档:

示例:GNU并行作为队列系统/批处理pipe理器

GNU并行可以作为一个简单的作业队列系统或批处理pipe理器。 这个想法是把作业放到一个文件中,然后让GNU并行读取。 由于GNU并行将在文件结尾处停止,因此我们使用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 

是的,这是可能的pipe道:

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

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

你只需编写一个程序,只是给出命令(不要忘记;),然后pipe输出到ssh

你可能想要使用像dsh(Distributed SHell)这样的程序来完成这个工作:),在configuration主机名并设置publickeya auth之后,可以使用它在多台机器上运行命令(“run在机器a上运行,然后在机器上运行)或在pararell(“在所有机器上同时运行”)。 或者只是制作脚本

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

免责声明:我现在不能testing这个,因为我在一个带有bash但没有ssh的Windows机器上。

在bash脚本中,你可以这样做:

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

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

 echo 'echo hi' >&4 

如果你这样做,你不能轻易地访问命令的结果,但根据你的问题,似乎并不需要你。