2017-10-16 3 views
1

私はBashスクリプトでセットアップしたいVMをたくさん持っています。私はすべてのVMのすべてのIPアドレスを持つテキストファイルを持っていて、各行の前に "ssh VM-Name"と書いてありますので、スクリプトが各行を読み込んでいるときには各VMにSSHして、 。それは何とかループを壊し、最初のVMへのSSH後に停止します。どのようにして最初のVMを終了し、次のSSHにSSHできますか?Bashスクリプトループの問題(VMへのSSH)

#!/bin/bash 
#set -x 

cat nodes.txt|while read sshlink 
do 
    echo ------------------------------------------------------- 
    echo Creating Users on: $sshlink 
    $sshlink 'echo connecting...; sleep 2; echo Creating...; sleep 1; sudo apt  
    install ntp; uname -a; sleep 1; sleep 2; echo disconnecting...; exit;' 
done 

nodes.txt

ssh [email protected] 
ssh [email protected] 
ssh [email protected] 
ssh [email protected] 

の内容は最初のVMにSSHを行い、それは私が指定されたコマンドを実行しますが、それはその次とに終了し、ループしません。

MyUsername$ ./setupnodes.sh 
------------------------------------------------------- 
Creating Users on: ssh [email protected] 
connecting... 
Creating... 

WARNING: apt does not have a stable CLI interface. Use with caution in scripts. 

Reading package lists... 
Building dependency tree... 
Reading state information... 
ntp is already the newest version (1:4.2.8p4+dfsg-3ubuntu5.6). 
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. 
Linux node-1 4.4.0-93-generiC#116-Ubuntu SMP Fri Aug 11 21:17:51 UTC 2017  
x86_64 x86_64 x86_64 GNU/Linux 
disconnecting... 
+0

これを簡単にするためのexpectスクリプトを書くことができます。https://unix.stackexchange.com/questions/288099/how-to-write-expect-in-shell – MohitC

+0

'ssh -v ...'を使うことができます。より深く掘り下げるために、より多くのログを印刷する。切断 – georgexsh

+0

'... DEBUG2:チャンネル0:空 DEBUG2 OBUF:チャンネル0:close_write DEBUG2:チャンネル0:出力ドレイン - > DEBUG2を閉じ:チャンネル0:ほとんど死ん DEBUG2:チャンネル0:GCを:ユーザに通知します DEBUG2:チャンネル0:GC:チャンネル0:クローズ DEBUG2を送る:ユーザーが DEBUG2を外しチャネル0:死ん DEBUG2です:チャンネル0:ごみは DEBUG1を収集:チャンネル0:自由:クライアント・セッションは、1 をnchannels DEBUG1 :fd 0 O_NONBLOCKをクリアする 転送:3940を送信し、3908バイトを6.4秒で受信 秒あたりのバイト数:611.1を受信し、606.1を受信 debug1:終了status 0 + exit ' – benice

答えて

0

ここでこれを試してください。私は同様の問題のためにそれを使用している:

while read -r remote_host; 
do 
    ssh $remote_host bash -s <<"END" 
    echo "Do Something" 
    echo "Do something else" 
    ... 
    echo "Closing connection" 
END 
done<$1 

スクリプトは、新しい線で区切られたホストのリストを受け入れる、それぞれにsshはアクションを実行します。各コマンドは新しい行に置くことができます。

このスクリプトでは、heredoc表記を使用しています。