关于shell脚本中嵌套expect中的转义问题
cat bat-ssl-run.sh
#!/bin/bash
function auto_scp() {
local file=$1
local user=$2
local user_pwd=$3
local ip=$4
expect<<EOF
set prompt "(%|#|\\\\\$) \$" ;# default prompt
set timeout -1
spawn scp $file $user@$ip:~
expect {
"yes/no" { send "yes\r"; exp_continue }
"*assword:" {send "$user_pwd\r"; exp_continue }
100% { send_user "\r********************文件传送完成********************\r"; exp_continue }
-re \$prompt { send_user "\r********************其实这句不会用到********************\r" }
}
EOF
}
auto_scp testfile root rootpwd@123 192.168.71.144
注意
1.expect<<EOF后面的不能接收参数 [lindex argv 0] [lindex argv 1],所以原先这种形式
set a [lindex $argv 0]
的传参,需要放到expect<<EOF的前面,使用shell的方式传参
2.expect<<EOF 外部设置的变量,可以直接解析,但是内部set设置的变量,需要在变量使用时,把$转义成为\$
3.原先在expect中表示shell提示符用
set prompt "(%|#|\\$) $" ;# default prompt
在expect<<EOF内部,\和$都需要转义,其中
\转义为\\
$转义为\$
所以\\$就要转义成\\\\\$
以上变量设置变为:
set prompt "(%|#|\\\\\$) \$" ;# default prompt