How to use rsync over FTP
Solution 1:
rsync isn't going to work for you for the reasons others have mentioned. However, lftp and ncftp both have "mirror" modes that will probably meet your needs.
I use this to push stuff from my local directory to a ftp or sftp web host:
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"
Solution 2:
As written by easel, lftp
is a good tool.
I suggest you to parametrize the script, and make use of the
exclude-glob
options, that excludes filenames using the glob feature (*,? ..) of your 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"
Warning: make sure that the target directory exists, otherwise the cd command will fail, so operation including deleting trees of files will take place at wrong directory (root)!
I have updated script so that --delete
option is disabled by defaut, enable it by uncommenting the DELETE= command
.
Solution 3:
You don't. rsync can't do that for you, it is a protocol of its own and doesn't work over FTP.
You might, however, want to try csync. IIRC it provides rsync-like behaviour over HTTP. I can't comment on whether it works over FTP, you'll have to try it.
Solution 4:
Depending of what you're actually trying to do, another completely different approach could be use curlftps
to mount a ftp folder, and then maybe rsync
the two "local" folders.
The installation is different depending on your distro so I can't generalize on that, but you need to installfuse
and curlftpfs
(prolly Debian already has fuse
install by default), then:
sudo apt-get install curlftpfs
Make sure the
fuse
module is loaded (modprobe fuse
)sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other
Note that there's no space after the last comma (it's not a typo!). If you're satisfied with that or don't want to make that every time, you can add it to your fstab (usually in /etc/fstab
):
curlftpfs#user:[email protected] /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0
In that case, you have to make sure the fuse module is loaded before.
Be advised though, of two things:
- That the developer dropped the project one or two years ago, so I don't know how usable/stable for the time being.
- If the password contains a weird character
curlftpfs
could fail (maybe you can do something with the.netrc
).
Solution 5:
There is weex...
Weex is an utility designed to automate the task of remotely maintaining a web page or other FTP archive. It will synchronize a set of local files to a remote server by performing uploads and remote deletes as required.