expect脚本自动连接ftp服务器下载文件

这篇博客介绍了如何利用 Expect 脚本自动化从 FTP 服务器下载文件。内容包括设置脚本变量、处理登录认证、指定下载路径、下载特定文件及遍历下载多个文件。此外,还展示了如何在脚本中执行 shell 命令和处理参数,以及在遇到特定字符串时执行相应操作。这个脚本对于需要频繁进行 FTP 文件下载的工作场景非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/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命令,不然脚本命令会错乱执行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值