2012-06-15 59 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,在实际问题中提问,并提供更多细节。 –