expect、awk 批量复制远端文件到本地指定文件夹

expect介绍

expect 是由Don Libes基于TclTool Command Language )语言开发的,主 要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率
expect 语法:
expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
选项
-c:从命令行执行expect脚本,默认expect是交互地执行的
示例:expect -c expect "\n" {send "pressed enter\n"} '
-d:可以输出输出调试信息
示例:expect -d ssh.exp
expect中相关命令
spawn:启动新的进程
send:用于向进程发送字符串
expect:从进程接收字符串
interact:允许用户交互
exp_continue: 匹配多个字符串在执行动作后加此命令

awk介绍

报告生成器,格式化文本输出
处理机制类似sed命令,自带循环处理 读入一行处理一行然后自动读取下一行再进行处理
sed命令换行的标识是固定的,只能是回车换行. awk里面的换行符是可以自定义的.awk自动把读入的行按照指定的切割符号切割成若干个字段 默认的切割符号是空白符号(包括连续的空白符号,tab键,回车换行符).

下面是downloadFile.sh

OLD=$IFS
IFS=$'\n' 
# IFS作为分隔标识 、 循环读取fileData.txt每行内容
for line in `cat fileData.txt`
do
        if [ "$line" = "" ]
        then
                continue;
        fi
        #获取第一列的参数 默认 空格分隔 $line
        scp=$(echo $line | awk '{print $1}')
        origin=$(echo $line | awk '{print $2}')
        dest=$(echo $line | awk '{print $3}')
        # / 作为分隔符 取最后一列
        fileId=$(echo $origin|awk -F '/' '{print $NF}') 
        echo $fileId
        #判断 $dest 这个文件夹是否存在存在则忽略否则创建
        if [ ! -d "$dest" ];then
                mkdir -p $dest
        else
                echo "文件夹存在"
        fi
        localFile=$dest$fileId
        echo $localFile
        #判断文件是或否存在
        if [ -f "$localFile" ];then
               echo "文件存在"
               continue
        fi
        echo $line
        expect expectscp.sh $scp $origin $dest
done

下面是expectscp.sh

#!/usr/bin/expect -f
#参数1
set comand [lindex $argv 0] 
#参数2
set ori [lindex $argv 1]
#参数3
set des [lindex $argv 2]
#expect 执行shell命令 这里不用加set timeout 直接等待命令执行完成
#默认timeout 30s
spawn $comand $ori $des
expect { "yes/no"
      {send "yes\r";exp_continue}
}
#需要自己修改
expect "root@host's password:"
#需要自己修改
send "密码\r"
expect "*100%*"
expect eof

fileData.txt 格式

scp  root@host:2017/2017-11-06/01h8b4pDJ099PK6wfrHTM15.png  2017/2017-11-06/
scp  root@host:2017/2017-11-06/0ueJjUOZVcGWoUeMgMRTCKw.png  2017/2017-11-06/
scp  root@host:2017/2017-11-06/005048zL9aDWRAQRm1ZgRmgR.png  2017/2017-11-06/
scp  root@host:2017/2017-11-06/0tIJzZHld7Trwd0prxHwkJ.png  2017/2017-11-06/

这些数据 是存在数据库的,我是用过sql将其组装成这种格式的。
最后给chmod u+x downloadFile.sh expectscp.sh 增加可执行权限
./downloadFile.sh就能自动将远端程序文件复制到本地指定文件夹了

你可能感兴趣的:(expect、awk 批量复制远端文件到本地指定文件夹)