基本用法
1、$ sudo apt-get install lftp //安装lftp
2、$ lftp //进入lftp
2、lftp :~> lftp 192.168.1.124 //(或直接输入ftp的网址)登录远程ftp
3、lftp 192.168.1.124:~> user root //输入ftp用户名root (匿名ftp不用输入用户名和密码)
4、Password: 111111 //输入ftp密码(不回显)
5、lftp [email protected]:/> mirror jsweb /opt/www //将ftp上的jsweb(文件夹名称)下载到本地的/opt/www
终端常用命令:
ls
显示远端文件列表(!ls 显示本地文件列表)。
cd
切换远端目录(lcd 切换本地目录)。
get
下载远端文件。
mget
下载远端文件(可以用通配符也就是 *)。
pget
使用多个线程来下载远端文件, 预设为五个。
mirror
下载/上传(mirror -R)/同步 整个目录。
put
上传文件。
mput
上传多个文件(支持通配符)。
mv
移动远端文件(远端文件改名)。
rm
删除远端文件。
mrm
删除多个远端文件(支持通配符)。
mkdir
建立远端目录。
rmdir
删除远端目录。
pwd
显示目前远端所在目录(lpwd 显示本地目录)。
du
计算远端目录的大小
!
执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)
lcd
切换本地目录
lpwd
显示本地目录
alias
定义别名
bookmark
设定书签。
exit
退出ftp
lftp mirror的高级应用举例
mirror –delete –only-newer –verbose work /opt/bak/
自动备份服务器work文件夹,到本地opt/bak文件夹下,并且删除已经不存在的文件,并且只下载最新的文件,再给出详细的输出。
用 lftp 的 -e 选项,把命令直接接在 lftp 之后:
lftp -u username,password -e”mirror –delete –only-newer –verbose /work bak/”ftpIP
也可以用 at 选项指定备份的时间:
lftp at 01:00 -u username,password -e”mirror –delete –only-newer –verbose /work bak/” ftpIP
这样每天 1 点就会执行备份任务。
lftp中mirror这个命令的其他参数
-c, --continue 支持断点续传if possible
-e, --delete 如果远程目录下已经没有某个文件,而本地有,则删除这个文件。
--delete-first 在下载新文件之前先删除旧的文件
-s, --allow-suid 保留远程目录中设定的用户及组权限
--allow-chown 设置下载文件的所有者和所属组
--ignore-time 屏蔽时间判定,这样mirror只通过大小来判断文件,同步速度可以加快。
-n, --only-newer 只下载新的文件,mirror的判定新文件是通过文件大小和修改时间来判定的(这时候-c不能使用)
-r, --no-recursion 不下载子目录中的文件,即没有递归的功能
-p, --no-perms 不设置下载后文件的访问权限
--no-umask don't apply umask to file modes #这个不知道怎么翻译
-R, --reverse 上传到FTP
-L, --dereference download symbolic links as files #这个不知道怎么翻译
-N, --newer-than=SPEC 只下载某个特定时间以后更新过的文件
-P, --parallel[=N] 同时下载N个文件
-i RX, --include RX 下载时包含的文件名称,RX表示正则表达式
-x RX, --exclude RX 下载时不包含的文件名称,RX表示正则表达式
-v, --verbose[=N] 关于操作的详细输出。
--log=FILE 将已经执行过的lftp命令写入文件
--script=FILE 将lftp命令写入文件,但不执行
--just-print, --dry-run same as --script=- #这个不知道怎么翻译
说到空闲超时,要明白的一点是,任何FTP客户端设定的超时时间都必须参考FTP服务器软件的空闲超时设置,也就是说如果客户端设置的时间值大于服务器端设置的时间值时,FTP客户端上设置的值是没意义的,因为在此之前FTP服务端已经断开了连接. 注意,FTP服务端空闲超时与FTP客户端空闲超时的处理是不一样的,这可以在日志中得到体现,一般来说标准的FTP服务器软件对于本身空闲超时会是一个421代码,按rfc定义为"Connection timed out",而客户端超时首先会发送一QUIT命令,然后服务端返回221成功代码(Goodbye). 如果可以自由调控FTP服务器,最快的方法当然将FTP服务器软件的超时设置调大,然后再来设置客户端软件,很多情况下我们是没有权限来操作FTP服务器软件的,而且我们要的是客户端一直连接而不超时,这个对FlashFXP等windows下地客户端来说设置是很简单的,设置间隔一定时间发送一"NOOP"指令就可以了,当然这个时间间隔得小于服务器的超时时间. 具体到lftp,虽然没有直接的设置选项,但由于lftp功能强大,组合一些命令还是可以实现的
repeat 120 "quote 'NOOP'" &
实质是上每隔120s发送一NOOP指令('&'表示后台运行),repeat和quote都是lftp命令,可以看下lftp的man,lftp默认超时时间是3分钟(180s),所以一定要在超时前发送'NOOP'指令,120s还是有效的,当然,前提是服务端超时值应该比这个要大.
要更改超时设置,可以修改~/.lftprc或者~/.lftp/rc,lftp在启动时会依次执行/etc/lftp.conf ~/.lftprc ~/.lftp/rc,不推荐直接修改/etc/lftp.conf
可以看看~/.lftprc文件中的内容
set net:reconnect-interval-base 10
set net:reconnect-interval-max 300
set net:reconnect-interval-multiplier 2
lftp连接失败后重试间隔由这三个参数决定,连接失败时,重试处理流程基本如下:
1. 如果是第一次重试,net:reconnect-interval-base 第一次连接失败时重试间隔,间隔reconnect-interval-base重试
2. 每次重试间隔为:上次重试间隔 * reconnect-interval-multiplier,当计算出来的重试间隔超过reconnect-interval-max值时,重试间隔又恢复到reconnect-interval-base,相当于跳到了第一步.
下面的设置基本上能保证重试间隔为1s:
set net:reconnect-interval-base 1
set net:reconnect-interval-max 3
set net:reconnect-interval-multiplier 4
在客户端看来,跟一直连接没多大区别,当然最完美的还是用在服务端未断开前发NOOP指令了,如果服务端超时时间比较长,也可以设置lftp的超时间隔
set net:timeout 1h
下面是一些lftp下载的例子
remote_ip = “192.168.0.1"
remote_path = "/home/smart/test/"
local_path = "/home/abc/Desktop/"
file_list = [vga.mp4, hello.mp4]
#无密码ftp下载
wget = "lftp -e \"set net:limit-rate 10000000;set net:timeout 3;set net:max-retries 1;set net:reconnect-interval-base 1;set net:reconnect-interval-max 5;set net:reconnect-interval-multiplier 1; open %s; mirror -c -x '.mp4' -i {} '%s' '%s'; ls '%s' > '%s/.listing'; quit\"".format(' -i '.join(file_list)) % (remote_ip, remote_path, local_path, remote_path, local_path)
os.system(wget)
# open 连接远程ftp地址
# mirror -c 下载整个文件夹,断点续传
# -x 后面正则表达式,不下载这些文件
# -i 后面正则表达式,下载这些文件 一起用可以下载某些MP4文件和其他所有文件
# ls remote_path > local_path/.listing 把远程文件所有文件名放到本地.listing文件中
# set net:limit-rate 10000000 最大使用宽带
# set net:timeout 3 超时时间3s
# set net:max-retries 1 最大重试次数
# set net:reconnect-interval-base 1 第一次连接失败时重试间隔
# set net:reconnect-interval-max 5 最大重试时间间隔
# set net:reconnect-interval-multiplier 1 每次重试间隔为:上次重试间隔 * reconnect-interval-multiplier,当计算出来的重试间隔超过reconnect-interval-max值时,重试间隔又恢复到reconnect-interval-base,相当于跳到了第一步
#有密码ftp下载
username_passwd = "-u username,passwd"
#无密码时,可以是username_passwd 为""
wget = "lftp %s %s -e \"set net:limit-rate 10000000;set net:timeout 3;set net:max-retries 1;set net:reconnect-interval-base 1;set net:reconnect-interval-max 5;set net:reconnect-interval-multiplier 1; mirror -c -x '.mp4' -i {} '%s' '%s'; ls '%s' > '%s/.listing'; quit\"".format(' -i '.join(file_list)) % (username_passwd,remote_ip[0:-1], remote_path, local_path, remote_path, local_path)