如何通过FTP使用rsync

任何unix:

我有以下的CMD行工作正常。

rsync -avr -e ssh /home/dir [email protected]:/home/ 

但是我现在需要将它设置为rsync到只有FTP服务器的远程服务器上。 我如何去做呢?

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

你没有。 rsync不能为你做,它是它自己的协议,并不能通过FTP工作。

但是,您可能想尝试csync 。 IIRC它通过HTTP提供类似于rsync的行为。 我不能评论它是否通过FTP工作,你将不得不尝试。

由于其他人提到的原因,Rsync绝对不会为你工作。

但是,lftp和ncftp都有“镜像”模式,可能会满足您的需求。

我使用这个来从我的本地目录中将东西推送到一个ftp或sftp的web主机:

 lftp -c "set ftp:list-options -a; open ftp://user:[email protected]; lcd ./web; cd /web/public_html; mirror --reverse --delete --use-cache --verbose --allow-chown --allow-suid --no-umask --parallel=2 --exclude-glob .svn" 

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

我build议你参数化脚本,并利用它

 exclude-glob 

选项,使用shell的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命令将失败,因此包括删除文件树的操作将发生在错误的目录(root)!

我已经更新了脚本,以便通过--delete禁用--delete选项,通过取消注释DELETE= command启用它。

根据你实际要做的事情,另一种完全不同的方法可能是使用curlftps挂载一个ftp文件夹,然后rsync两个“本地”文件夹。

安装是不同的,这取决于你的发行版,所以我不能一概而论,但是你需要安装fusecurlftpfs (prolly Debian已经默认安装了fuse ),那么:

  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:[email protected] /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0 

在这种情况下,您必须确保保险丝模块在之前被加载。

尽pipe如此,有两件事:

  • 一两年前开发者放弃了这个项目,所以我暂时还不知道这个项目有多可用。
  • 如果密码包含一个奇怪的字符curlftpfs可能会失败(也许你可以做一些.netrc )。

有weex …

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

rsync不能通过ftp工作。 在远程端,它需要rsync守护程序或可以调用rsync的shell。 Ftp通常允许你调用几个命令,而rsync不是其中之一。 还有一些其他的工具可以自动执行ftp任务,比如“lftp”。

这似乎是一个很好的和自由的适合: https : //savannah.gnu.org/projects/ftpsync/

对于你想要做的事情,你也可以使用wget。

wget -m ftp://用户名:[email protected]

我正在使用GVFS / FTP。 我使用gigolo安装远程FTP服务器。 因为他们被看作本地目录几乎所有的本地文件的工作。 rsync被devise为远程计算文件哈希以比较文件而不传输它们,但是用虚拟文件做这些文件传输文件。 统一和freefilesync通常工作正常,但我遇到了一个问题,当他们想重命名file upload,没有问题的下载。 这可能是gvfs 1.6.1的一个问题。

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

Jonas S的解决scheme可以根据情况而变得有用,例如,如果您的下载速度很高,上传速度较慢,那么检查服务器上的文件可能比上传不必要的文件要快。

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

尽pipe一般情况下,最好使用普通的FTP客户端而不是rsync。

我不相信你能做到这一点,你试图Rsync的服务器将只有一个FTP服务器运行,它不会理解Rsync发送它的命令。

如果你想这样做的原因是你只能访问端口21,但你有服务器的控制权,你可以改变服务器上的Rsync监听端口,但是这显然只在你不想要在该端口上使用FTP。

如果你想自动执行任务,那么使用lftp就像你可以创build一个脚本,就像有些人已经在上面发布了一样,如果你想要一个一次性的解决scheme(即你需要下载整个网站通过ftp /移动到另一个服务器)使用ncftp,它的简单,安装它,如果它尚未安装:

 apt-get install ncftp 

要么

 yum install ncftp 

(抱歉,非Debian /红帽子发行..)

一旦安装,在terminal打开ncftp然后键入:

 open -u ftpusername ftp.thedomain.com 

它会要求你input密码,input密码,然后:

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

它会为你做的工作rest..祝你好运

使用“sitecopy”或“镜像”可以为您节省大量的带宽。

他们都处理有效的增量更新。

还有wput:

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

用户名和密码是从〜/ .netrc中读取的。 否则,如果你不是特别关心安全性,你可以将它们提供为ftp:// username:[email protected]

我做了自己的命令行工具: ftpsync

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

用法:cd到您的项目目录并input:

 ftpsync user:[email protected]/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' 

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

我使用下面的一个。

 rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh [email protected]:/folder1/ /folder2/