1.背景
在面向shell编程时对于需要交互的场合则必须通过人工来干预,而对于这种方式是违反无人职守的原则;现在expect就解决了这个问题,
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。
Expect是在Tcl基础上创建起来的,用来做一些linux下无法做到交互的一些命令操作,在远程管 理方面发挥很大的作用。
spawn命令激活一个Unix程序来进行交互式的运行。
send命令向进程发送字符串。
expect 命令等待进程的某些字符串。
expect支持正规表达式并能同时等待多个字符串,并对每一个字符串执行不同的操作。
2.安装
在安装expect之前需要先安装TCL(最早称为“工具命令语言”"Tool Command Language", 但是目前已经不是这个含义,不过我们仍然称呼它为TCL)是一种 脚本语言。
这里使用的安装包:tcl8.4.20-src.tar.gz 和 expect5.45.tar.gz
tar zxvf tcl8.4.20-src.tar
cd tcl8.4.20
./configure --prefix=/usr/local/tcl --enable-shared
make
make install
TCL安装完毕,下面安装expect
tar zxvf expect5.45.tar.gz
cd expect5.45
./configure --prefix=/usr/local/expect
make
make install
expect到此就安装结束了,expect的安装目录在/usr/local/expect;但可执行文件却不在该目录下,我们可以使用find命令来查找,如:find / -name expect
一般情况下,expect与tcl在一起的,我的存放的地方在:/usr/local/tcl/bin/expect ;如果觉得这个路径太长或者不合,可以使用软链接到你想的位子上。
3.代码验证
ScpStart()
{
line=11.22.33.44 #IP地址
/usr/local/bin/expect << EOF
set time 20
spawn scp -r /opt/upProtocol/ptcBinPacket root@$line:/opt
expect {
"*yes/no*"
{ send "yes\r";exp_continue }
"*password:"
{ send "xxxxxx\r"}
}
expect eof
EOF
if [ $? -eq 0 ]
then
echo "复制文件到$line成功!"
else
echo "复制文件到$line失败!"
fi
}