# 替代简陋的Linux FTP命令,使用免费开源的Linux FTP客户端LFTP,快速同步目录,多线程断点续传

最近由于公司业务需要迁移两台Linux服务器，而服务器上存储着大量的Docker挂载卷，迁移时就需要对这些重要数据进行备份。刚好手上有一台几个T的FTP服务器，于是决定将数据备份到FTP服务器。

由于要备份的文件体积有几十个GB之巨，不方便进行打包压缩，最理想的是直接将本地目录同步到FTP服务器。

尝试使用Linux默认的`ftp`命令发现此命令功能较弱，仅支持文件上传下载等简单操作，并不能支持目录上传下载，经过一番Google后，我们发现`lftp`是一个不错的替代选项。

`lftp` 是一个免费开源且功能强大的Linux FTP客户端工具，它支持`ftp, http, sftp, fish, torrent`等网路协议，它支持命令补全，历史记录，允许多个后台任务执行等功能，它还有书签、排队、镜像、断点续传、多进程下载等功能，使用起来非常方便。

### 1. 安装
可以直接使用Linux包管理工具安装即可，如：
```bash
sudo yum install lftp -y # CentOS
sudo apt install lftp -y # Ubuntu
```

### 2. 基本使用
```bash
lftp [options] <site>
options:
 -f <file>           执行文件中的命令后退出
 -c <cmd>            执行命令后退出
 -e <cmd>            登录后后执行命令
 -u <user>[,<pass>]  用户名密码鉴权
 -p <port>           连接端口,默认21
site:                FTP服务器地址
 
# 使用 Colin用户登录到192.168.0.211 FTP服务器
lftp -u Colin,123123 192.168.0.211
```

### 3. 常用命令
`lftp`支持常见Shell命令，命令默认在服务端运行，多数情况下在命令前使用`!`则可以在本地执行。

命令|功能|备注
:-|:-|:-
`ls`|显示服务器文件列表|`!ls`显示本地文件列表
`cd`|切换服务器目录|
`lcd`|切换本地目录|`!cd`不可用
`pwd`|显示服务器当前目录|`lpwd`与`!pwd`均可显示当前本地目录
`mkdir`|创建服务端目录|
`mv`|移动文件或目录|
`rm`|删除服务端文件或目录|`!rm`删除本地文件或目录
`get`|下载文件|`get -c init.sql` #断点下载init.sql
`mget`|下载多个文件|`mget -c *.txt` #下载当前目录所有txt文件
`put`|上传文件|`put -c init.sql` #断点上传init.sql
`mput`|上传多个文件|`mput -c *.txt` #上传当前目录所有txt文件
`mirror`|同步目录|上传或下载目录

上传下载文件(`get/put/mget/mput`)可选参数：
```bash
-c      #支持断点续传
-E      #传输后删除源文件
-e      #传输前删除目标文件
-a      #指定传输为 ascii 模式，默认为二进制模式
-P N    #最大同时传输文件
-O      #指定本地或远程存放目录
```

同步目录(`mirror`)常用参数:
```bash
-c  #支持断点续传
-R  #默认为下载远程到本地，使用 -R 参数则会上传本地到远程，两者任一缺省则使用同名。
-n  #只下载较新的档案，可用于增量备份
-r  #只下载当前目录，不递归目录
 
# 断点下载服务端jira目录到到当前目录
mirror -c jira
# 断点上传本地confluence目录到服务器
mirror -c -R confluence
```

### 4.书签管理
```bash
bookmark list       #显示书签列表
bookmark add name   #保存当前连接为书签名字 name,下次打开可直接使用 lftp name
bookmark edit name  #编辑书签
bookmark del name   #删除书签
```

### 5.高级配置
`lftp`全局配置文件默认为`/etc/lftp.conf`，我们可以按需修改其全局设置，如修改编码，设置主动模式，忽略SSL错误等。
```bash
# 忽略SSL错误，可修复 Fatal Error: Certificate Verification: Not Trusted 
set ssl:verify-certificate no
 
# 启用主动模式，默认为被动模式。主动模式客户端开启数据传输端口，被动模式服务端开启数据传输端口
set  ftp:passive-mode  no
 
# 设置服务端编码
set  ftp:charset  "gbk"
# 设置客户端编码
set  file:charset  "UTF-8"
```
