Working in the industry, at one time or another, you will have to transfer files. Im sure it will be in a variety of different ways. For the most part everyone has their favorites for each situation. But I would prefer to have one utility on all servers to handle all of those situations. So, my choice has to be a bad ass.
Lets look at some requirements:
- support for all of my common protocols
- easy and logical navigation
- parallel threads!
- full command line usage.
lftp has become my tool of choice. Let me prove it with some examples:
Example 1:
At some point, everyone has had to mirror a directory that was being served by Apache with directory indexing turned on. Something like http://pkgs.repoforge.org/bsc/.
debian:/tmp/outgoing# lftp
lftp :~> open http://10.100.15.10/log/dists/lenny-20120514/binary-i386/
cd ok, cwd=/log/dists/lenny-20120514/binary-i386
lftp 10.100.15.10:/log/dists/lenny-20120514/binary-i386> mirror
Total: 1 directory, 69 files, 0 symlinks
New: 69 files, 0 symlinks
180374247 bytes transferred in 136 seconds (1.27M/s)
lftp 10.100.15.10:/log/dists/lenny-20120514/binary-i386>
Downloading a Debian image from a local box. But look at the protocol… http://. I’m able to treat a web page like a cli. But it does lack the depth to do anything crazy. As far as I can see, there isnt a way to be like “mirror http://10.100.15.10/log/dists/lenny-20120514/binary-i386/a*”
Other ways to solve this? Yes. I could have done a fancy curl request stripping html using links/lynx, and then wgetting the result.
Example 2:
You need an entire directory copied from your server, to another server(put)… But you only have SSH.
[root@core ~]# ls -l lame
total 300
-rw-r--r-- 1 root root 100002 2013-01-13 05:32 a
-rw-r--r-- 1 root root 100003 2013-01-13 05:32 b
-rw-r--r-- 1 root root 100004 2013-01-13 05:32 c
[root@core ~]#
Now lets go ahead and login over sftp.
[root@core ~]# lftp sftp://root@g1.ragenetworks.com
Password:
lftp root@g1.ragenetworks.com:~> mirror -R --parallel=3 lame
Total: 1 directory, 3 files, 0 symlinks
New: 3 files, 0 symlinks
300009 bytes transferred in 2 seconds (133.2K/s)
lftp root@g1.ragenetworks.com:~>
What I did was reverse(-R) mirror the directory. In other words I put the directory from my server, to the remove box. But I also did this using parallel threads(–parallel=N).
Example 3:
Along with command line usage is, how scriptable is it. There are many times you need to simply back up a directory with a cron job. This time we are going to use ftp, and script our remote commands in a file.
[root@core ~]# cat script-file
open ftp://username:password@fazey.org
mirror -R /root/local /home/james/remote
exit
[root@core ~]#
Now we call lftp with the “-f” flag to give it a script input.
[root@core ~]# lftp -f script-file
at 80527360 (80%) 35.12M/s eta:1s [Sending data]
...
[root@core ~]#
As you can see, lftp is a hell of a tool.