2017-02-20 121 views
2

我想實現一個期望腳本到b​​ash腳本中。忍受着我,因爲我對bash/expect有點陌生。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 

現在,我希望能在包括一個bash腳本這expect腳本但預期它不工作。

這是我到目前爲止有:

#!/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擴展,因爲整個東西都是Tcl程序。在你的第二個腳本中,變量'$ server'由bash擴展,並且由於沒有帶這個名字的bash變量,它被替換爲空字符串。 – user1934428

回答

2

您可以使用/usr/bin/expect -c執行expect命令:

#!/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

Bertrand的答案是解決你的問題的一種方式,但不與你在做什麼解釋這個問題。

猛砸試圖擴大雙引號內的字符串變量,所以你expect腳本會看到空白的空間,您希望看到$servers$s$fh。此外,你有三重嵌套的雙引號字符串,這將導致解析參數到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 

(要做到這一點真的很正確,你應該建立公共密鑰認證,然後你就可以擺脫的期望通過直接從bash運行ssh server "grep 'something' /some/log/file.log"

+0

另外,在'expect'腳本中進行的日誌記錄可以在事物的'bash'一側更加簡潔地完成。 – miken32