Linux定时任务实现ftp远程文件下载并通过scp传输到其他服务器的shell开发

  场景:公司内部服务器需要定期下载外网服务器提供的文件,但是服务器不能直接与外网交互,故申请一台前置机连外网下载远程文件并传输到服务器上,用shell脚本的方式实现。

  因之前没接触过shell脚本开发,所以此次也是学习记录一下自己的开发过程。

  1、ftp实现远程文件下载并解压指定文件到指定目录

  shell脚本如下:

#从FTP上下载文件解压并传输到服务器
#!/bin/bash
startTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "===============>startTime is ${startTime}<==============="
cd /home/user01/myShell
ftp -v -n 服务器地址< user 用户名 密码
binary #二进制方式
cd Chinese #下载的文件存放目录
lcd /home/user01/myShell #下载文件存到服务器上的地址
prompt
mget UPIDGWL.ZIP #获取文件UPIDGWL.ZIP
close
bye
EOF
echo "download UPIDGWL.ZIP successfully"
unzip -j UPIDGWL.ZIP ENTITY.XML -d downloadFile;
mv downloadFile/ENTITY.XML downloadFile/ENTITY1.XML #提取zip中的ENTITY.XML并重命名
endTime=$(date "+%Y-%m-%d %H:%M:%S")
echo "===============>endTime is ${endTime}<==============="

  针对上面shell脚本中,我开发中遇到了几个坑:

A、ftp获取文件方式有二种,get和mget,但是我用get获取时下载的文件一直有问题,没查出来原因。

B、 下载文件之后解压时,需要顺序执行解压和重命名操作,所以需要在解压之后加一个“;”,否则会重命名失败。

  2、通过expect实现scp远程文件传输

如果是单纯的linux系统间文件传输,可以直接执行:

scp  /home/user01/myShell/aa.txt  远程服务器用户名@IP:/home

但是如果是用shell脚本,就需要先下载expect,安装命令:yum install expect

因为我这边需要传输多个文件,所以直接放在一个文件夹内,直接把文件夹传输过去。

shell脚本如下:
Linux定时任务实现ftp远程文件下载并通过scp传输到其他服务器的shell开发_第1张图片

  3、shell脚本的内部调用

为了直接启动一个定时任务实现下载传输,所以就把第二个脚本在第一个shell后面直接调用就可以了,其中shell脚本的调用有三种方式:fork、exec、source

这三种方式的区别可以参考:https://blog.csdn.net/simple_the_best/article/details/76285429

我用的第一种 fork方式。

一开始我直接调用时,一直执行不成功,后来才知道是我的shell脚本的格式不对。因为我脚本是在windows环境写的,格式为doc,需要修改成unix格式:

修改方式为:

1) vi loadFile.sh (进入编辑模式)

2) :set ff (查看脚本的文件格式是否为doc)

3) :set ff=unix (设置脚本格式为unix)

4) :wq! (保存退出)

然后再执行shell脚本就OK了。

4、Linux crontab定时任务

关于crontab定时任务常用的几个命令:

查询crontab状态: service crond status
启动crontab:service crond start
关闭crontab:service crond stop
编辑定时任务:
    crontab -e
查看当前用户任务:
    crontab -l
删除所有任务:
    crontab -r

如果想要使用定时任务启动shell脚本,一定要确定当前用户拥有执行权限,可以先测试一下:

直接运行试下:/home/dbuser/myShell/loadFile.sh

如果不行就需要赋权限:chmod u+x loadFile.sh

启动一个每天下午4点40的定时任务命令如:

40 16 * * * /home/dbuser/myShell/loadFile.sh >> /home/dbuser/myShell/download.log

其中>> /home/dbuser/myShell/download.log表示输出日志追加打印到download.log文件,如果是覆盖就使用 >

crontab任务中每个参数意义可以参考:http://www.runoob.com/linux/linux-comm-crontab.html

你可能感兴趣的:(Linux,Shell开发)