如何通过FTP使用rsync


187

任何Unix:

我有下面的cmd行,效果很好。

rsync -avr -e ssh /home/dir user@example.com:/home/

但是我现在需要将其设置为rsync到只有FTP服务器的远程服务器。我该怎么办?

我查看了rsync帮助,但很快就迷路了(我不经常这样做)。


21
这类似于询问如何在IRC上使用HTTP或在SMTP上使用FTP ...
Juliano

2
也许您可以解释一些想要这样做的理由,那么我们可以帮助您提出可行的解决方案。
詹姆斯

1
本质上,我试图从共享的托管服务器上自动执行备份,并且不了解rsync的工作方式。我现在已经转移到一个VPS,并没有FTP的限制了
bumperbox

口是心非是你的上帝:scie.nti.st/2013/4/13/...
user956584

如果是部署,您在想什么,而您不介意NodeJS,请检查dploy,lazy并与git配合良好
Frank Nocke

Answers:


78

你不知道 rsync不能为您做到这一点,它是它自己的协议,不能在FTP上运行。

但是,您可能想尝试csync。IIRC通过HTTP提供类似rsync的行为。我无法评论它是否可以在FTP上运行,您必须尝试一下。


1
查看csync网页,它支持sftp,但是没有提及对纯ftp的支持。
Keith Thompson

162

由于其他人提到的原因,rsync无法为您工作。但是,lftpncftp都具有“镜像”模式,可能会满足您的需求。

我使用它将内容从本地目录推送到ftp或sftp网络主机:

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"

2
lftp非常好。我刚刚发现的另一个wput内置带宽限制。
karmakaze

122

画架所写,lftp是一个很好的工具。

我建议您对脚本进行参数化,并利用

exclude-glob

选项,不包括使用Shell的全局功能(* ,? ..)的文件名:

#!/bin/bash    
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$HOST"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
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-exclude"

警告:请确保目标目录存在,否则cd命令将失败,因此包括删除文件树的操作 将在错误的目录(根目录)中进行!

我已经更新了脚本,因此该--delete选项已被defaut禁用,请通过取消注释来启用它DELETE= command


帮助了我一大堆。但是我不得不删除“ set ftp:list-options -a;” 哪儿乱七八糟的东西。

1
是否存在通过SFTP(FTPS)执行相同操作的类似内容?
trusktr 2012年

1
我之前会这样做cd $RCD,以防止a-script-with-a-typo意外删除错误目录中的文件:set cmd:fail-exit yes。(似乎lftp没有注意到,它实际上已经退出,直到发出下一条命令。) -而在此之前cd $LCD我会做到这一点(在当地壳,也就是在纸条的顶部): set -eu
KajMagnus 2012年

3
实际上,第一次运行脚本时,我还没有创建远程目录,因此该脚本无法CD到该不存在的目录中。然后脚本开始到mirror,并且--delete从错误的目录开始:d文件。(但是我又将它们复制回去,所以在这种情况下没关系。也许对其他人来说很重要。)
KajMagnus

1
遵循@KajMagnus关于使用'set -eu'和'cd $ LCD'的建议,在'cd $ LCD'之前添加'mkdir -p $ LCD'-这样,您可以确保目录存在并且您在里面。
Paul Gear

25

根据您实际要执行的操作,可以使用另一种完全不同的方法curlftps来安装ftp文件夹,然后挂载rsync两个“本地”文件夹。

安装因发行版本而异,因此我无法一概而论,但是您需要安装fuseand curlftpfsfuse默认情况下,prolly Debian已安装),然后:

  1. sudo apt-get install curlftpfs

  2. 确保fuse模块已加载(modprobe fuse

  3. sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other

请注意,最后一个逗号后没有空格(这不是错字!)。如果您对此感到满意或不想每次都这样做,可以将其添加到fstab中(通常在中/etc/fstab):

curlftpfs#user:password@ftp.yourserver.com /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

在这种情况下,您必须确保已装入保险丝模块。

但是,请注意以下两点:

  • 开发人员在一两年前放弃了该项目,所以我暂时不知道其可用性/稳定性。
  • 如果密码包含一个奇怪的字符,则curlftpfs可能会失败(也许您可以使用进行某些操作.netrc)。

FTP Fuse和rsync最接近这个问题,但是除了少数小文件之外,其他任何东西显然都很疯狂。
Steve-o

1
为什么会疯呢?默认情况下,rsync stat()s不比较内容。可以通过ls -l和ftp客户端来完成。
ptman

我实际上尝试过此操作(通过rsnapshot),但它不起作用,每个文件都返回了错误,并显示rsync无法创建链接。因此,结合使用lftp和rsnapshot可以达到目的
Konstantin

14.04 LTS完美无缺;额外提示:当你准备卸载您的FTP站点只需使用umount DIR其中DIR是你/path/to/ftp/folder上面。

1
2017年,这仍然有效!老实说,最简单的方法是从FTP站点中复制文件。本地安装,然后像本地一样进行rsync
td512

16

weex ...

Weex是一种实用工具,旨在自动执行远程维护网页或其他FTP存档的任务。通过根据需要执行上载和远程删除,它将同步一组本地文件到远程服务器。


2
像魅力一样工作!您是这样运行的: $ weex yourFTPconfigName这是手册linuxcertif.com/man/1/weex
sobi3ch

9

rsync无法在ftp上运行。在远程端,它需要rsync守护程序或可以从中调用rsync的外壳。Ftp通常允许您调用一些命令,而rsync不是其中之一。还有其他一些工具可以自动执行ftp任务,例如“ lftp”。




5

您可以在http://linux.die.net/man/1/curlftpfs之后使用curlftpfs挂载ftp并使用rsync


欢迎使用ServerFault!这可能是一个很好的开始,但是关于为什么这是一个更好的方法的更多技术细节,也许是对如何做的模拟,可能是合理的。
Scott Pack

4

我正在使用GVFS / FTP。我用gigolo挂载了远程FTP服务器。由于它们被视为本地目录,因此处理本地文件的几乎所有内容都可以使用。rsync旨在远程计算文件哈希,以比较文件而不传输它们,但是使用虚拟文件执行此操作始终会传输文件。unison和freefilesync通常可以正常工作,但是当他们想重命名您上传的文件时却遇到了问题,下载没有问题。这可能是gvfs 1.6.1的问题。


3

根据情况,Jonas S的解决方案可能会很有用,例如,如果您具有较高的下载速度和较慢的上载速度,则检查服务器上的文件可能比不必要地上载文件要快。

不过,您可能要使用CurlFTPFS:http ://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

尽管通常最好还是使用常规的FTP客户端而不是rsync。


2

我不相信您能够做到这一点,您尝试Rsync的服务器将仅运行FTP服务器,它将无法理解Rsync发送它的命令。

如果您要这样做的原因是您只能访问端口21,但可以控制服务器,则可以更改服务器上Rsync侦听的端口,但这显然仅在您没有访问权限时才有用想要在该端口上使用FTP。


2

如果要自动化任务,请使用lftp,因为您可以创建脚本(如上一些人所述),如果您需要一次性解决方案(即,您需要下载整个网站),则可以按照自己的喜好轻松编写所有脚本通过ftp /将其移动到另一台服务器)使用ncftp,方法很简单,如果尚未安装,请安装:

apt-get install ncftp

要么

yum install ncftp

(对不起,非基于debian / red hat的发行版。)

安装完成后,在终端中打开ncftp,然后键入:

open -u ftpusername ftp.thedomain.com

它将要求您输入密码,输入密码,然后:

get -R /home/remotewebsite/public_html/ /home/localwebsite/public_html/

它将为您完成剩下的工作..祝您好运




0

为此,我制作了自己的命令行工具: ftpsync

为什么?因为它简单而优雅,所以其他工具需要很多依赖,有时需要编译,有时不起作用(例如MacOs High Sierra上的lftp)。Ftpsync是用纯Python编写的,不需要第三方库并且它很小,您可以在项目中包含该文件。

用法:cd到您的项目目录并键入:

ftpsync user:pass@ftp.address.url/remote/dir --delete

--delete 代表删除本地不存在的远程文件。

如果您不想同步而只运行原始ftp命令,请使用:

ftpsync -c '...'

对于一些简单的操作(例如发送文件并重命名)很有用:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'

由于与其他人相同的原因,偶然发现了这个。通过FTP协议需要良好的同步实用程序。您的工具看起来不错,但是我无法使用它,因为我的要求是从远程下载并与本地同步。我想避免下载已经下载的文件。在本地,我对下载的文件进行处理,这使其与众不同。下次运行FTP脚本时应跳过该命令。目前很难找到解决方案。
anup

是的,实际上是单向同步。
superdario128 '18

0

rclone是一款不错的软件,它可以通过ftp和许多其他协议(包括云存储提供商(Amazon S3,Dropbox,Google Drive))进行目录同步。它可以与本地或远程存储的任何组合同步。

要设置ftp遥控器,请遵循以下说明

完成后,同步操作为:

rclone sync /home/dir FTP_REMOTE:/home --progress 

-7

安装sftp,然后可以使用rsync。

我用下面的一个。

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/

7
不是 FTP,它可能使用SSH内部的sftp子系统(至少这是它在默认配置中所做的工作)
serverhorror

csync(sftp)和rsync可能是相同的工作方式
Rajat,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.