我遇到了与期待有关的问题。
当我运行包含以下行的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:line 62:意外令牌附近的语法错误}'
./script.sh: line 62:
}'
我认为这是因为我不在脚本顶部包含#!/ usr / bin / expect但是如果我使用它并执行我的脚本它不做任何事情并在终端显示所有代码在执行之后。那么我们可以同时包括#!/ usr / bin / expect和#!/ bin / bash吗?
此致 阿迪亚
答案 0 :(得分:9)
当然bash不能解释expect命令,就像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
你可以将期望脚本放在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