我需要编写一个脚本,使用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
它停留在第一个节点,并没有做任何事情。
答案 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 document,EOF
将终止<<\EOF
。 for 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
您的日志文件。