2017-01-31 19 views
2

私はホスト名でforeachループを実行してからexpectスクリプトを実行しようとしています。各ノードは技術サポートで出力を生成するために様々な時間を持っています。sshのforループで期待通りのスクリプトが動作しない

Usage: 
    ./test.sh admin password 

Filename: hostnames.txt 
      node1 

スクリプト:私が得るtest.sh

#!/usr/bin/expect 
set exp_internal 1 
set timeout 4 
set user [lindex $argv 0] 
set password [lindex $argv 1] 
set rootdir /home/$user 
set f [open "$rootdir/hostnames.txt"] 
set hosts [split [read $f] "\n"] 
close $f 
log_user 1 

foreach host $hosts { 
puts $host 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null "[email protected]$host" 
expect "*assword: " 
send "$password\r" 
expect "#" 
send "file md /TS/\r" 
expect "#" 
send "admin tech-support /TS/$host.ts1\r" 
expect "#" 
sleep 180 
expect "#" 
send "logout\r" 
expect eof 
close $spawn_id 
} 

エラーがhostnames.txtファイル内の唯一のノードが存在する、以下のとおりですが、techsupportがノード1に完了すると、それはエラーを返します。 hostnames.txtアップの行を改行にしてから:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null [email protected] 
ssh: : Name or service not known 
send: spawn id exp6 not open 
while executing 
"send "$password\r"" 
("foreach" body line x) 
invoked from within 
"foreach host $hosts { 
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHost..." 
(file "./test4.sh" line x) 

答えて

1

分割は2つのエントリであなたのリストを与えているhostnames.txtファイルに追加した場合は、別のノードに対して実行しようとしている場合のでわかりません改行の後にある空文字列。 $ hostが空でない文字列であるかどうかをテストする必要があります。

hostnames.txtに別の行を追加し、2番目のホストで正しく動作することを確認してください。これを試したい別のテストノードがない場合は、代わりに "node1"という名前の重複した行を追加して、ループの両方の反復が同じことを行うことを確認してください。

+0

こんにちはTimさん、アップデートありがとうございました。私はそこにチェックを入れました。もしif {[string length $ host]!= 0} "....今atleastはsshエラーを表示しませんしかし、私はまだエラーが発生しています。 "send:spawn id exp6 not open" – user3897774

+0

あなたが$ホストが空であるように見える質問であなたが見せた出力で、それはまだそうであるようですか?それはnode1でも正しく動作しますか?それは私があなたの元の質問から理解したものです。 "if {[string length $ host]" ... ...部分は、foreachループ全体をカバーしているのですか、またはspawnコマンドだけですか?申し訳ありませんが、私はこれがどこに残っているかは完全にはっきりしていません。 –

+0

なぜそれが空の文字列を拾うのか分かりません...そのファイルにnode1以外のエントリはありません.....チェックしたら.....その文をforeachループ内で生成する直前に置く.... – user3897774

関連する問題