expect、awk 批量复制远端文件到本地指定文件夹
expect介绍
expect
是由Don Libes
基于Tcl
( Tool 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
就能自动将远端程序文件复制到本地指定文件夹了