2011-03-02 122 views
2

我有20台机器,每台机器运行一个进程。该机器被命名为:在BASH命令中使用变量?

[ “MACHINE1”, “机2”,......, “machine20”]

要检查的过程中是如何做的machine1,我发出以下命令从远程计算机:

ssh machine1 cat log.txt 

对于machine2,我发出以下命令:

ssh machine2 cat log.txt 

同样,对于machine20,我发出以下命令:

ssh machine20 cat log.txt 

是否有bash命令,让我可以查看使用一个命令所有计算机的输出?

+0

ServerFault的人可能更倾向于回答这个问题(我已投票支持迁移。) – corsiKa 2011-03-02 17:12:57

回答

3

如果机器是很好的编号就像在你的榜样:

for i in {1..20} ; do ssh machine$i cat log.txt; done 

如果你在一个文件中的计算机列表,你可以使用:

cat machinesList.txt | xargs -i ssh {} cat log.txt 
+0

+1工程的奇迹。 – karlphillip 2011-03-02 17:24:38

+0

谢谢你克里斯。非常感谢您的帮助! – user3262424 2011-03-02 23:13:07

+1

我确实接受你的答案,作为最好的答案。 – user3262424 2011-03-03 18:40:03

2
for i in {1..20} 
do 
    ssh machine$i cat log.txt 
done 
2

使用loop

for i in {1..20} 
do 
    ssh machine$i cat log.txt 
done 

但请注意,你是一个远程shell会话,而不是当前一个内运行cat,所以这可能并不如你预期相当的工作。试试看看。

+0

不错,我们在同一分钟有相同的循环 – Orbit 2011-03-02 17:15:38

+0

@Orbit teeheehee,伟大的思想! – 2011-03-02 17:15:56

3

您可以将所有机器名称存储在数组或文本文件中并循环。

declare -a machineList=('host1' 'host2' 'otherHost') # and more... 


for machine in ${machineList[@]} 
do 
    ssh $machine cat log.txt 
done 

我假设你的机器都不能随便命名为 'MACHINE1', '机2' 等

一些链接:

+0

我用这种方法看到的唯一问题是:1:如果命令真的很长,会发生什么? 2.)machineList中的某台机器发生了故障或无响应? – ajpyles 2011-03-02 18:27:41

+1

@ajpyles - 1.如果命令真的很长,那么用我的方法表达它并不是最好的方法。这取决于用例是什么,我不想提出一些通用的解决方案,我给出了一个快速的解决方案,提问者可以使用没有太多问题。 2.如果一台机器没有响应,那么ssh命令将返回一个错误并且脚本将会进行。如果你想,你也可以异步启动'ssh'。可能还有其他问题,如远程ssh框想要用户名/密码,但在这种情况下,似乎提问者已经找到了该部分。 – birryree 2011-03-02 18:40:06

1

除了使用循环的建议之外,您可能需要查看工具s,如psshdsh,专为在多个客户端上运行命令而设计。

+0

+1当我需要处理20个新的实例时,我很感兴趣。 – birryree 2011-03-02 17:19:12

2

将您的主机放在一个文件中并使用while循环,如下所示。注意使用-n标志上ssh

while read host; do ssh -n $host cat log.txt; done < hosts-file 

或者您可以使用PSSH

pssh -h hosts-file -i "cat log.txt" 
2

我会建议使用一种叫做Shmux程序。尽管这个名字,它的作品非常好。我已经与100多台机器一起使用,效果很好。它也优雅地为您处理机器故障,这可能是bash for loop方法的缺点。

我认为这个程序最酷的地方在于能够为您的命令发出多个线程,允许并行运行所有20台机器上的命令。

+0

谢谢,请记住这一点 – user3262424 2011-03-02 23:18:22