背景:对数据对接的同事来说,经常会遇到,要实时的去对方服务器下取文件的情况,本文介绍一个,ftp实施取文件的脚本实例。
*/1 * * * * test.sh & //crontab定时,脚本每分钟执行一次
脚本内容如下:
#!/bin/bash
cd /dir //本机路径
#对与一整套的ftp操作常常要放到<<! 内容!这种格式下,把内容作为一个子输入,执行完成后再返回主shell
ftp -n -v ip地址 21 <<!user 账户 密码
binary //使用二进制传输
passive //进入被动传输
prompt //关掉交互方式
cd dir //远程路径
nlist *.txt log_1.txt //将文件列表保存到本机
close
bye
!
//下边是个小技巧这里只取没用下载过的文件
comm -3 log_1.txt log_2txt > log_3.txt //取两个文件的差放到log_3num="`cat log_3.txt|wc -l`" //文件个数
cat log_1.txt >log_2.txt
//将文件循环下载下来
for ((i=1;i<=$num;i++));
do
str=`cat log.txt | tail -n +$i | head -n 1`
ftp -n -v ip地址 21 <<!
user 账户 密码
binary
passive
prompt
cd dir //远程路径
lcd dir //本机路径
get $str //下载文件
close
bye
!
done
注意:
get一次只下载一个文件;mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载全部的文件,可以先用prompt命令关掉交互方式(关闭:prompt off;打开:prompt on)。
采用二进制传输。如果你要上传下载,这一步很重要,不先执行这个命令,上传下载会很慢。大多数系统(包括UNIX系统)只有两种模式:文本模式和二进制模式。文本传输器使用ASCII字符,并由回车键和换行符分开,而二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。一般来说,我们最好都用binary方式,这样可以保证不出错。
附几个常用命令
cd进入远程主机目录的父目录。
close中断与远程服务器的ftp会话
delete file.txt:删除远程机器文件。
mdelete 删除多个远程主机文件。
get file.txt 下载文件
put 上传文件
mput 将多个文件传输至远程主机。
mget下载多个远程文件
help显示ftp内部命令的帮助信息
lcd将本地工作目录切换至dir。
ls显示远程目录
nlist显示远程主机目录的文件清单,并存入本地硬盘
prompt设置多个文件传输时的交互提示。
pwd显示远程主机的当前工作目录。
rename更改远程主机文件名。
rmdir dirname删除远程主机目录。
size filename显示远程主机文件大小
status显示当前ftp状态。
个人观点,欢迎指正
本人原创,转载请注明出处