#!/usr/bin/expect
#根据文件名从ftp下载文件到指定目录
#远程主机的IP地址
set ip 192.168.1.1
#登陆密码
set password ABC123
#设置超时时间
set timeout 10
#需要下载的文件名
set file test.txt
#ftp服务器上文件所在路径
set ftpPath /home/file
#文件下载到本地的路径
set localPath /opt/
#执行ftp $ip命令
spawn ftp $ip
#如果出现Name字符
expect "Name*"
#则输入ftp登陆的用户名并回车
send "user\n"
#如果出现Password字符
expect "Password*"
#则输入密码并回车
send "$password\n"
#如果出现ftp字符
expect "ftp>*"
#切换本地路径
send "lcd $localPath\n"
#切换到ftp文件所在目录
send "cd $ftpPath\n"
#发送get $file命令
send "get $file\n"
expect {
#如果返回的字符串含有received则说明下载成功
"*received*" { send_user "Download successful!";send "quit\n"}
#如果返回的字符串中含有Failed则说明下载失败
"*Failed*" { send_user "Download failed!";send "quit\n"}
}
expect eof
1.expect脚本环境中设置shell命令变量
set today [exec date +%Y%m%d]
相当于下面的shell脚本代码
set today `date +%Y%m%d`
shell命令执行结果为当前时间,格式yyyyMMdd,如:20220409
2.expect脚本设置执行参数
#脚本的第一个参数,远程主机的IP地址
set ip [ lindex $argv 0 ]
#脚本的第二个参数,登陆密码
set password [ lindex $argv 1 ]
上面代码表示该expect脚本执行,需要两个参数,分别为ip和密码,执行方法为:
./test.exp $ip $password
3.下载json_search开头的文件(json_search*.txt)
#显示ftp当前目录下的所有文件,相当于ls
send "nlist\n"
#如果出现json_search
expect "json_search*"
#获取json开头的文件名,赋值file变量
set file $expect_out(0,string)
#发送get $file命令
send "get $file\n"
4.下载指定文件夹下面所有文件夹中的指定文件
比如:ftp上面mediaKsj文件夹下面有一些省份文件夹,201,202...210表示省份编码,分别是不同省份的文件夹,每个省份文件夹下面有json_search文件,目标下载所有省份的json_search文件到本地
/home/mediaKsj
201
json_search_201.txt
202
json_search_202.txt
...
210
json_search_210.txt
通过expect脚本遍历下载,本地脚本所在目录存放一个carrierId.txt文件,存放上面的所有省份编码
#获取省份文件行数
set line [exec cat ./carrierId.txt | wc -l]
#定义数组变量存放所有省份编码
set carrierIdArr(0) 0
#遍历省份文件,本地创建文件夹,并赋值上面的数组
for {set i 1} {$i <= $line} {incr i} {
set carrierId [exec head -n $i ./carrierId.txt | tail -1]
set mkdir [exec mkdir -p $mediaPath/$carrierId]
set carrierIdArr($i) $carrierId
}
carrierId.txt文件内容:
201
202
...
210
注:expect每次执行命令前都要加expect命令,不然脚本命令会错乱执行!