我有一个bash脚本,它循环遍历服务器列表,通过SSH运行一些远程命令,并将这些命令的输出写入本地文件。 对于我在远程服务器上运行的每个命令,我打开一个新的SSH会话。 有没有办法,只有一个SSH会话保持开放的服务器,我可以运行多个命令的输出,我可以redirect到本地文件?
您想查看SSH的ControlMaster设置。 这允许您创build单个SSH连接,然后通过该连接将所有其他SSH连接复用到同一台服务器。 非常便利。
注意:当你说本地文件的时候,我不确定你的意思是本地的机器,或者你的机器是本地的,启动ssh会话。
推vs拉:
这听起来像这可能不是正确的工具,也许你只是想在每台本地机器上使用cron? 如果需要从主服务器获取信息,则可以通过cron作业从服务器获取文件。 这将是一个更拉的方法,ssh是我所说的push方法。 我不能说你的情况哪个更好,但是这可能是需要思考的问题。
运行多个命令:
我不明白,如果你的意思是保持打开多个命令的每个会话的会话,或者只是让它总是打开。 如果是前者,则可以在命令之间使用分号,或者使用&&来创build下一个命令。 例如:
#bar echoed only if foo exists and can be read ssh myServer 'cat foo && echo bar' ssh myServer 'cat foo; echo bar'
如果你想指定在shell中使用东西,你也可以做如下的东西:
ssh myServer "bash -c 'cat foo && echo bar'"
最后,你可以把脚本放在每个服务器上,然后运行它。
“expect”工具也可以做你想做的事情,但是涉及到编写tcl。
为了扩展ControlMaster的使用,下面是一个更具体的例子:
CONTROL=/tmp/ssh-control-`date +%s`-$RANDOM ssh -o BatchMode=yes -NfM -S $CONTROL & MASTERPID=$? ssh -o BatchMode=yes -S $CONTROL command1 > outfile1 ssh -o BatchMode=yes -S $CONTROL command2 > outfile2 kill $MASTERPID
这在很大程度上是未经testing的,但它应该给你正确的总体思路。
你可以依次运行几个命令,在远程系统上启动一个shell并传递命令:
ssh server "echo this is; all in one session"
会自动将引用的string通过远程shell。 但是要小心shell引用规则!