脚本登录主服务器然后登录其节点

时间:2015-11-27 12:26:36

标签: shell

我需要编写一个脚本,使用ssh登录主服务器,并使用fuel node命令查看节点,然后连接到其节点分别查看所有节点的日志文件在/var/log/nova-all.log

t.ex
node a 192.168.1.2
node b 192.168.1.3
node c 192.168.1.4

我试图这样做

#!/bin/bash

for i in 192.168.1.2 192.168.1.3 192.168.1.4

do

ssh -t "*masterserver name*" ssh $i | cat /var/log/nova-all.log

done

它停留在第一个节点,并没有做任何事情。

1 个答案:

答案 0 :(得分:2)

您的方法无效的原因是管道将由您的本地系统解释。因此,只有ssh $i$i替换为相应的IP will be executed on your master server. cat / var / log / nova-all.log`将在本地计算机上执行,而不是通过主服务器发送在子节点上执行。

如果本地shell $yourmasterserver上的shell为bash,则以下内容应该有效:

ssh $yourmasterserver <<\EOF
for subnode in $(fuel node | awk '{ print $3 }')
do
  ssh $subnode cat /var/log/nova-all.log
done
EOF

<<\EOF开始HERE documentEOF将终止<<\EOFfor subnode in $(fuel node | awk '{ print $3 }') do ssh $subnode cat /var/log/nova-all.log done 中的反斜杠导致替换被关闭,因此HERE doc内容实际上是

ssh $yourmasterserver

这四行将作为标准输入(stdin)馈送到ssh$(...)将stdin上接收的任何内容(除了一些控制序列)传递给远程shell以供执行。 (这就是为什么在交互模式下,您只需输入要执行的远程站点的内容。)

ssh将被执行其内容的输出所取代。此执行将在服务器上执行,因为(由于上述保护),该行将按原样发送到| awk '{ print $3 }'

fuel node为您提供上一个命令输出的第三列(此处为您的for)。 $subnode循环遍历结果,使用循环体中的cat中的每个元素连接到该节点并NSMutableArray您的日志文件。