下载expect命令 sudo apt-get install expect
spawn: 是开一个新的进程去执行后面的命令
expect:是获取spawn命令执行后的信息,看看是否和其事先指定的相匹配,如果匹配就会执行后面的内容。如果单独写expect不写spawn,就不会触发。
send: 发送指定的字符给系统。
exp_continue: 是让expect继续往下匹配。
eof: 关键字用于匹配结束符。
expect 中scp命令传输文件是单个执行的需要具体到文件名
interact 允许用户使用命令交互操作
使用scp传输
#!/bin/bash/
hd=(86 19 91 71 13 51 36 70 31 30 17 11 34 75 74 81 87 89 79 88 10 83 90 76 84 85 97 18 38 59 50 ZZZZ )
# 打印数组的个数
echo "打印数组的个数" ${#hd[@]}
# 获取上月的时间
NowTime=`date -d "1 month ago" +"%Y%m"`
# 指定传输文件的月份
# NowTime='202209'
# 远程服务器密码
password=123456
echo "省份文件传输开始"
for ((i=0;i<${#hd[@]};i++))
do
# 文件名
hd_name_3=${hd[i]}settlement${NowTime}.zip
hd_name_8=${hd[i]}new_settlement${NowTime}.zip
echo '当前传输的文件名:' ${hd_name}
# scp -p 远程端口 -r 本地路径 用户名@ip:/远程路径
# 远程传输
# 三个文件的传输
expect -c "
spawn scp -r /rxldc/${hd_name_3} acc@ip:/home/ldcc/
expect {
\"*assword\" {set timeout 300; send \"${password}\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
}
expect eof"
# 八个文件的传输
expect -c "
spawn scp -r /rxldc/${hd_name_8} acc@ip:/home/ldcc/
expect {
\"*assword\" {set timeout 300; send \"${password}\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
}
expect eof"
done
echo '===文件传输完成===='
使用sftp传输
#!/bin/bash/
# 传输的省份文件
hd=( 59 )
# 打印数组的个数
echo "打印数组的个数" ${#hd[@]}
# 获取上月的时间
NowTime=`date -d "1 month ago" +"%Y%m"`
# 指定传输文件的月份
# NowTime='202209'
# 远程服务器密码
password=123456
# 覆盖解压
cd /home/rxld/
unzip -o test${NowTime}.zip
# 修改文件名
mv test1${NowTime}.csv test2${NowTime}.csv
echo "省份文件传输开始" test${NowTime}.zip
for ((i=0;i<${#hd[@]};i++))
do
# 文件名
hd_name_8=test*${NowTime}.csv
echo '当前传输的文件名:' ${hd_name_8}
# 远程传输
# 八个文件的传输
expect -c "
#spawn scp -r /home/rxld/${hd_name_8} user@192.268.101.100:/download/
spawn sftp user@192.268.101.106
expect {
\"*assword\" {set timeout 300; send \"${password}\r\"; exp_continue;}
\"yes/no\" {send \"yes\r\";}
\"sftp>\" {send \"put /home/set/${hd_name_8} /download\r\";}
#\"Uploading\" {send \"exit\n\";}
}
# interact ###允许用户使用命令交互操作
# 退出远程连接
expect \"sftp>\" {send \"exit\r\";}
expect eof"
done
echo '===8个文件的传输完成===='
echo '===end文件的传输完成end===='