任何unix:

我有下面的cmd行,工作正常。

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


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

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

评论

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

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

本质上,我试图从共享的托管服务器自动执行备份,并且不了解rsync的工作方式。我现在已移至vps,并且不再受ftp的限制

重复是你的上帝:scie.nti.st/2013/4/13/…

如果是部署,那么您在想什么,而您不介意NodeJS,请检查dploy,lazy并与git
一起很好地工作

#1 楼

你不知道rsync不能为您做到这一点,它本身就是一个协议,不能在FTP上运行。

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

评论


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

–基思·汤普森(Keith Thompson)
2014年7月11日在2:06

#2 楼

由于其他人提到的原因,rsync无法为您工作。
但是,lftp和ncftp都具有“镜像”模式,可能会满足您的需求。将内容从我的本地目录推送到ftp或sftp Web主机:

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"


评论


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

– Karmakaze
13年7月17日在6:46

我建议添加“ set ftp:use-mdtm-overloaded true”,以将文件mtime设置为与原始文件相同(应该使用另一种方式,即无反向)。

– MarcRechté
5月29日12:43

#3 楼

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

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

exclude-glob


选项,其中不包括使用外壳程序的全局功能(* ,? ..)的文件名:

 #!/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命令将失败,因此包括删除文件树的操作将在错误的目录(根目录)中进行!

我已更新了脚本,因此defaut已禁用--delete选项,请取消对DELETE= command的注释使其启用。

评论


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

–垫
10 Nov 16 '20:33



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

–trusktr
2012-3-14的2:52

我会在cd $ RCD之前执行此操作,以防止a-script-with-typo意外删除错误目录中的文件:set cmd:fail-exit ye​​s。 (在您发出下一个命令之前,lftp似乎没有注意到它实际上已经退出了。)—在cd $ LCD之前,我要这样做(在本地外壳中,即在脚本的顶部):设置-eu。

– KajMagnus
2012年6月28日在21:05



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

– KajMagnus
2012年6月28日在22:09



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

– Paul Gear
13年3月19日在22:04

#4 楼

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

安装方式因您的发行版,因此我无法一概而论,但是您需要安装fusecurlftpfs(默认情况下,prolly Debian已经安装了fuse),然后:


sudo apt-get install curlftpfs
确保已加载fuse模块(modprobe fuse)。请注意,最后一个逗号后没有空格(这不是错字!)。如果您对此感到满意或不想每次都这样做,则可以将其添加到fstab中(通常在sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other中):

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


情况下,您必须确保保险丝模块已预先装入。

但是,有两点要注意:


开发人员放弃了一个或一个项目。两年前,所以我暂时不知道它的可用性/稳定性。
如果密码中包含一个奇怪的字符/etc/fstab可能会失败(也许您可以对curlftpfs进行一些操作)。


评论


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

– Steve-o
2011年9月23日在21:03

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

–ptman
2011-12-30 11:21

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

–康斯坦丁·佩雷阿斯洛夫(Konstantin Pereiaslov)
2013年2月11日4:25



14.04 LTS完美无缺;另一个提示:当您准备卸载FTP站点时,只需使用umount DIR,其中DIR是您的/ path / to / ftp / folder。

–乔
15年8月4日在15:42

2017年,这仍然有效!老实说,最简单的方法是从FTP站点中复制文件。本地挂载,然后rsync好像是本地挂载

–td512
17年5月11日下午5:45

#5 楼

有一个weex ...


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


评论


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

– sobi3ch
2015年1月30日14:48



#6 楼

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

#7 楼

这似乎是一种很好的免费选择:https://savannah.gnu.org/projects/ftpsync/

评论


鉴于近来蒸蒸日上的10英尺长SourceForge变得越来越多,也许您应该更新指向该项目网页的链接。

–HopelessN00b
16-2-22在0:32

#8 楼

对于您要尝试执行的操作,也可以使用wget。

wget -m ftp:// username:password@domain.com

评论


那只会成为站点的一面镜子。您不能使用它来上传您的修改。

– David V.
2011年2月2日在10:06

#9 楼

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

评论


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

–斯科特包
2012年12月9日在22:11

#10 楼

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

#11 楼

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

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

尽管如此,通常最好使用一个常规的FTP客户端,而不是rsync。

#12 楼

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

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

#13 楼

如果要自动化任务,请使用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/


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

#14 楼

使用“ sitecopy”或“ mirror”可以节省大量带宽。

它们都可以处理有效的增量更新。

评论


sitecopy:packages.debian.org/stretch/sitecopy/directory.fsf.org/wiki/Sitecopy

– myrdd
18-10-8在13:52



#15 楼

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

按照以下说明设置ftp远程。

完成后,同步操作为:

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


#16 楼

还有wput:

wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir


用户名和密码是从〜/ .netrc中读取的。否则,如果您不特别关注安全性,则可以将它们提供为ftp:// username:password@target.host。

#17 楼

为此,我制作了自己的命令行工具:
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
18年3月16日在13:11

是的,实际上是单向同步。

–superdario128
18 Mar 19 '18 at 22:48

#18 楼

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

我使用以下命令。

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


评论


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

–马丁M.
09年6月12日在12:27

csync(sftp)和rsync可能是相同的工作方式

–拉贾特
09年6月12日在12:34