2012-06-15 54 views
4

我遇到了與期望相關的問題。expect命令在bash腳本中不起作用

當我運行abc.sh,其中包括以下行

#!/usr/bin/expect 
spawn scp /etc/httpd/conf/httpd.conf 192.168.0.12:/tmp 
###################### 
expect { 
-re "password:" { 
exp_send "PASSWORD\r" 
} 
} 
interact 

其工作正常

,但是當我在運行腳本中使用類似的代碼,它不工作


#!/bin/bash 
clear 
while read -u3 LINE 
do 
code ......... 
code ....... 
code ........ 

REMOTE_COMMANDS1="scp -r -v $BASE_DIRECTORY/$USERNAME $D_IPADDRESS:/home/" 

spawn $REMOTE_COMMANDS1 
###################### 
expect { 
-re "password:" { 
exp_send "redhat\r" 
} 
} 
interact 


done 3< /opt/sitelist.txt 

它給出錯誤

./script.sh:第62行:附近意外的標記}' ./script.sh: line 62:語法錯誤}」

我認爲這是由於這樣的事實,我不包括#在/ usr/bin中/期望在腳本的頂部但如果我使用這個並執行我的腳本,它不會做任何事情,並在執行完後顯示終端中的所有代碼。所以我們可以同時包含#!/ usr/bin/expect和#!/ bin/bash嗎?

問候, 阿迪亞

+0

@ Thanku Dmitri – aditya

回答

9

當然猛砸無法解釋期望的命令,就像bash的無法解釋的Java /的Perl/Python語法。有幾種方法。

寫的expect腳本作爲一個單獨的程序,並從bash腳本調用它:

#!/bin/bash 
clear 
while read -u3 LINE 
do 
    #... 
    ./expect_scp.exp "$BASE_DIR" "$D_IPADDRESS" "$USERNAME" "$PASSWORD" 
done 3< /opt/sitelist.txt 

expect_scp.exp

#!/usr/bin/expect 

set base_dir [lindex $argv 0] 
set remote_ip [lindex $argv 1] 
set username [lindex $argv 2] 
set password [lindex $argv 3] 
# or 
foreach {base_dir remote_ip username password} $argv {break} 

spawn scp -rv $base_dir/$username $remote_ip:/home/ 
expect -re "password:" 
exp_send -- "$password\r" 
interact 

可以把expect腳本的bash腳本里面適當注意引用。幸運的是單引號不是特別期望的。

#!/bin/bash 
clear 
export BASE_DIR D_IPADDRESS USERNAME PASSWORD 
while read -u3 LINE 
do 
    #... 
    expect -c ' 
     spawn scp -rv $env(BASE_DIR)/$env(USERNAME) $env(D_IPADDRESS):/home/ 
     expect -re "password:" 
     exp_send -- "$env(PASSWORD)\r" 
     interact 
    ' 
done 3< /opt/sitelist.txt 
+0

我是新來的bash腳本這是非常有用的,爲我工作。謝謝很多。 – aditya

+0

這對我真的很有幫助! tks ~~順便說一句,爲什麼我使用第一種方法(從sh腳本調用期望腳本)它保持警告,「跳過。」,我該如何解決這個問題? – JasonHuang

+0

@JasonHuang,在實際問題中提問,並提供更多細節。 –