任何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
两个“本地”文件夹。
安装是不同的,这取决于你的发行版,所以我不能一概而论,但是你需要安装fuse
和curlftpfs
(prolly Debian已经默认安装了fuse
),那么:
sudo apt-get install curlftpfs
确保fuse
模块已装入( modprobe fuse
)
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§ion=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/