想做一个本地ubuntu16.04到远程FTPserver的同步功能

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
micro_cy
帖子: 104
注册时间: 2011-07-20 11:33

想做一个本地ubuntu16.04到远程FTPserver的同步功能

#1

帖子 micro_cy » 2017-08-30 11:25

主要实现目标:
1、备份远程服务器x.x.x.50的FTPserver上的某个文件夹,比如databakup,其中有几个文件夹不需要同步,需要排除
2、推送本地一个文件夹到远程x.x.x.50的FTPserver的上面

实现方法,查了一些资料,感觉使用lftp的脚本功能配合crontab来实现比较靠谱

有几个疑问:
1、相同大小的文件是否跳过
2、脚本的一些参数不太明白是什么意思

脚本范本如下:

代码: 全选

通过lftp的mirror模式(ncftp也有mirror模式)

  从FTP服务器上备份到本地

  A、命令行方式  
lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com;
lcd ./web;
cd /web/public_html;
mirror --delete --use-cache --verbose --allow-chown
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"
  
  B、脚本方式  
#!/bin/bash
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
lftp -c "set ftp:list-options -a;
open ftp://$USER:$PASS@$HOST;
lcd $LCD;
cd $RCD;
mirror --delete \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-esclude"
  
  从本地恢复到FTP服务器上

  A、命令行方式  
lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com;
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"
  
  B、脚本方式  
#!/bin/bash
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
lftp -c "set ftp:list-options -a;
open ftp://$USER:$PASS@$HOST;
lcd $LCD;
cd $RCD;
mirror --reverse \
       --delete \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-esclude"
  
  两种方式间主要的差别就是在–reverse选项上,有这个选项就是put files,反之则是get files。
头像
九天星
帖子: 1440
注册时间: 2007-07-14 20:45

Re: 想做一个本地ubuntu16.04到远程FTPserver的同步功能

#2

帖子 九天星 » 2017-08-30 21:30

有类似的云同步工具可用,但不一定是FTP
onlylove
论坛版主
帖子: 5226
注册时间: 2007-01-14 16:23

Re: 想做一个本地ubuntu16.04到远程FTPserver的同步功能

#3

帖子 onlylove » 2017-08-30 21:32

rsync?
micro_cy
帖子: 104
注册时间: 2011-07-20 11:33

Re: 想做一个本地ubuntu16.04到远程FTPserver的同步功能

#4

帖子 micro_cy » 2017-08-31 14:18

已经搞定了,写了个脚本,用lftp,非常方便,配合crontab,很好用,也很简单:

具体的参数可以参考如下信息:

mirror [OPTS] [source [target]]

将源文件夹镜像到目标文件夹。如果目标文件夹以/结尾,原文件夹名称会被附加到目标文件夹名称之后。源和目标都可以是指向文件夹的URL。

-c, --continue 续传上次的任务
-e, --delete 删除远程目录上不存在的文件
--delete-first 在传输新文件之前删除旧的文件
--depth-first 进入下一层目录优先于文件传输
-s, --allow-suid 根据远程站点设置suid/sgid比特位
--allow-chown 尝试将自己设置为文件所有者和所有组
--ascii 使用ascii方式传输(隐含了--ignore-size)
--ignore-time 决定是否下载时忽略时间因素
--ignore-size 决定是否下载时忽略文件大小因素
--only-missing 只下载缺少的文件
--only-existing 只下载已经存在于目标文件夹中的文件
-n, --only-newer 只下载新文件(-c参数无法工作)
--no-empty-dirs 不创建空文件夹(隐含了--depth-first)
-r, --no-recursion 不进入子文件夹
--no-symlinks 不创建符号链接
-p, --no-perms 不设置文件权限
--no-umask 不使用文件预设权限
-R, --reverse 反向镜像(上传文件)
-L, --dereference 将符号链接作为文件下载
-N, --newer-than=SPEC 只下载比指定时间晚的文件
--on-change=CMD 只要有文件或文件夹存在差异就执行命令CMD
--older-than=SPEC 只下载比指定时间早的文件
--size-range=RANGE 只下载大小在指定区间上的文件
-P, --parallel[=N] 并行下载N个文件
--use-pget[-n=N] 使用pget传输每个文件
--loop 循环知道找不到差异
-i RX, --include RX 包括相匹配的文件
-x RX, --exclude RX 不包括相匹配的文件
-I GP, --include-glob GP 包括相匹配的文件
-X GP, --exclude-glob GP 不包括相匹配的文件
-v, --verbose[=level] 冗长操作
--log=FILE 将执行的lftp命令写入文件FILE
--script=FILE 将lftp命令写入文件FILE,但不执行
--just-print, --dry-run 与--script=-相同
--use-cache 使用缓存目录列表
--Remove-source-files 传输完成后删除源文件
-a 与--allow-chown --allow-suid --no-umask相同
使用-R时,第一个目录为本地目录,第二个目录为远程目录。如果第二个目录被忽略,将采用第一个目录的目录名。如果两个目录都被忽略,将采用当前的本地和远程目录。如果目标目录以/结尾,那么源目录名将被加到目标目录上。

RX是扩展的正则表达式,具体语法可参考egrep命令。

GP是通配符规则,比如*.zip。

包含和不包含选项可以被多次使用。符合以下规则之一的文件将被镜像传输:(1)符合包含规则而不符合之后的不包含规则;(2)不符合任何规则,但第一条为不包含规则。目录匹配时包括结尾的/。

注意:符号链接(软链接)不会被传输到远程服务器上,因为无法被FTP协议传输。要上传链接指向的文件,请使用mirror -RL命令(将符号链接视为普通文件)。

对于--newer-than选项,你可以使用文件或时间作为参数。时间参数的格式同at命令,如now-7days、week age等。如果指定为文件,将采用文件的修改时间。

冗长输出级别可以通过--verbose=level选项或者使用多个-v选项进行设定,比如-vvv。冗长输出级别为:

0 - 无输出(默认)
1 - 打印动作
2 - +打印不删除的文件名(当没有采用-e选项时)
3 - +打印
--only-newer关闭文件大小比较,只上传/下载新的文件,即使文件大小存在差异,默认情况下旧的文件会被新的文件代替。

当用URL代替目录时,可以对两台服务器上的目录进行镜像操作。只要可以,会自动使用FXP在FTP服务器之间进行文件传输。

一些ftp服务器默认隐藏了.开头的文件(如.htaccess),只会在LIST命令使用-a选项时显示。在这种情况下,使用设置set ftp:list-options -a。
回复