假设我有一个应用程序正在一台PC上运行,该应用程序通过SSH向网络上的另一台PC(都是运行Linux的计算机)发送命令。
例如,每次在#1上发生任何事情时,我都想在#2上运行一个任务。在此设置中,我必须在每个命令上创建SSH连接。
是否有任何简单的方法可以使用基本的unix工具来执行此操作而无需对自定义客户端/服务器应用程序进行编程?基本上,我想要的只是通过SSH建立连接,然后再发送一个命令。
假设我有一个应用程序正在一台PC上运行,该应用程序通过SSH向网络上的另一台PC(都是运行Linux的计算机)发送命令。
例如,每次在#1上发生任何事情时,我都想在#2上运行一个任务。在此设置中,我必须在每个命令上创建SSH连接。
是否有任何简单的方法可以使用基本的unix工具来执行此操作而无需对自定义客户端/服务器应用程序进行编程?基本上,我想要的只是通过SSH建立连接,然后再发送一个命令。
Answers:
不知道它是否可以在生产中使用,但是您可以执行以下操作:
在#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
,它将检测到文件已被替换,因此当文件变大时,您可以擦除它并重新创建一个新文件。
mkfifo /tmp/commands
应该是更好的解决方案
使用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
Neero,Cheerio
ssh -N
在没有远程命令的情况下启动会话,ssh_config中似乎没有相应的选项。
如果您经常遇到这种情况,请尝试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