2011-03-02 155 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