假设我有一台运行在一台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“reboot”>> / 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
如果你这样做,你不能轻易地访问命令的结果,但根据你的问题,似乎并不需要你。