2017-02-20 10 views
2

私はbashスクリプトにexpectスクリプトを実装しようとしています。私はかなり新しくbash/expectに慣れているので、私と一緒にいてください。私はbashスクリプトでは、この期待スクリプトが含まれるように期待していますが、意図したとおり、それは働いていない、今bashスクリプト内で期待する

log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 

は、ここで意図したとおりに動作期待スクリプトです。ここで

は、私がこれまで持っているものです。

#!/bin/bash 

XYZ=$(expect -c " 
file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
") 

echo "$XYZ" 

私は取得していますエラーは次のとおりです。

command substitution: line 42: syntax error near unexpected token `(' 
command substitution: line 42: `expect "$ " { puts $fh "$expect_out(buffer)"}' 

私はこれを実装する任意の他の方法に開いています! :)

+0

元のスクリプトでは、変数 '$ servers'はTclによって展開されます。 2番目のスクリプトでは、変数 '$ server'はbashによって展開され、この名前のbash変数がないので、null文字列に置き換えられます。 – user1934428

答えて

2

あなたはexpectコマンドを実行する/usr/bin/expect -cを使用することができます。

#!/bin/bash 

/usr/bin/expect -c ' 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
spawn ssh $s 
expect "password: " 
send "PASSWORD\r" 
expect "$ " 
send "grep "something" /some/log/file.log" 
expect "$ " { puts $fh "$expect_out(buffer)"} 
send "exit\r" 
} 

close $fh 
' 
+0

優秀、これは私が探していたものです。ありがとう! –

+0

このアプローチを使用して、期待値コードに変数を渡す方法はありますか? – Kayvar

0

ベルトランの答えはあなたの質問を解決する一つの方法ですが、あなたは何をしていたかに問題があることを説明していません。あなたが$servers$s、および$fhを見たい場所をごexpectスクリプトは空白が表示されますので、

はbashは、二重引用符で囲まれた文字列内の変数を拡張しようとします。さらに、二重引用符で囲まれた文字列が三重にネストされていると、引数の解析でさまざまな問題が発生し、expectになります。

意見の問題ですが、何かがそれ自身のプログラムと見なされる特定の点に達すると、別のファイルに分けられるべきだと思います。

#!/usr/bin/expect 
log_user 0 

file delete foo.txt 

set fh [open foo.txt a] 

set servers {[email protected] [email protected]} 

foreach s $servers { 
    spawn ssh $s 
    expect "password: " 
    send "PASSWORD\r" 
    expect "$ " 
    send "grep 'something' /some/log/file.log" 
    expect "$ " { 
     puts $fh "$expect_out(buffer)" 
    } 
    send "exit\r" 
} 

close $fh 

それは実行可能だことを確認し、その後、あなたのbashスクリプトから呼び出し:

#!/bin/bash 
/usr/local/bin/my_expect_script 

(実際にはこれを適切に行うには、公開鍵認証を設定する必要があり、その後、あなたが期待を取り除くことができますすべてssh server "grep 'something' /some/log/file.log"をbashから直接実行してください)

+0

また、 'expect'スクリプトで行われているロギングは、事の' bash'側でより簡潔に行うことができます。 – miken32

関連する問題