1. 安装与配置
安装
-
Linux:
- Debian/Ubuntu:
sudo apt update && sudo apt install lftp
- CentOS/RHEL:
sudo yum install lftp
- Arch/Manjaro:
sudo pacman -S lftp
- Debian/Ubuntu:
-
macOS:
brew install lftp
-
Windows:
- 通过 Cygwin 安装,勾选
lftp
包。 - 或使用 WSL(推荐):
sudo apt install lftp # 在 WSL 的 Ubuntu 环境中运行
- 通过 Cygwin 安装,勾选
2. 文件与目录操作
上传文件
-
单个文件上传:
put local_file.txt # 指定远程路径: put local_file.txt -o /remote/path/remote_file.txt
-
批量上传文件:
mput *.txt # 上传所有 .txt 文件 mput -O /remote/path/ *.txt # 上传到指定目录
上传文件夹
- 递归上传整个目录(保留权限和时间戳):
mirror -R /local/dir /remote/dir
- 排除文件:
mirror -R --exclude *.tmp /local/dir /remote/dir
- 覆盖已有文件:
mirror -R --overwrite /local/dir /remote/dir
- 排除文件:
修改与删除
- 重命名文件/目录:
mv old_name.txt new_name.txt
- 删除文件:
rm file.txt
- 递归删除目录:
rm -r directory/
- 修改文件权限(仅限 SFTP/Shell):
chmod 755 file.txt
3. mirror命令使用详解
在 lftp
中使用 mirror
命令下载目录时,默认会自动跳过已存在且文件大小、时间戳一致的文件。但若需显式控制跳过已下载文件,可通过以下方法实现:
1. 默认行为(无需额外参数)
mirror /remote/dir /local/dir
- 自动跳过条件:
- 目标路径已存在同名文件。
- 文件大小和修改时间戳(若协议支持)与远程文件一致。
- 这是最轻量的方式,适合大部分场景。
2. 显式跳过已存在文件
方法 1:使用 --only-newer
参数
仅下载比本地文件更新的远程文件(根据时间戳判断):
mirror --only-newer /remote/dir /local/dir
- 适用场景:远程文件可能被覆盖更新,需增量同步最新版本。
- 注意:若本地文件时间戳被意外修改,可能导致跳过有效文件。
方法 2:使用 --ignore-time
参数
仅根据文件大小差异判断是否跳过(忽略时间戳):
mirror --ignore-time /remote/dir /local/dir
- 适用场景:时间戳不可靠(如某些FTP服务器配置异常),需依赖文件大小校验。
- 缺点:无法检测内容相同但大小一致的文件差异(极少数情况)。
3. 强制不覆盖已存在文件
若需绝对避免覆盖本地文件(即使远程文件更新):
mirror --no-overwrite /remote/dir /local/dir
- 效果:完全跳过本地已存在的文件(无论远程是否更新)。
- 适用场景:本地文件为只读备份,禁止任何覆盖操作。
4. 排除已下载文件的干扰
若本地文件因传输中断导致不完整,可结合 --use-pget
实现断点续传:
mirror --use-pget=3 /remote/dir /local/dir
- 原理:分段下载时记录进度,自动跳过已下载的片段。
- 提示:通过
set cmd:interactive
可显示分段进度。
5. 示例命令
基本跳过已下载文件
lftp -c "open -u user,pass ftp://example.com; mirror --only-newer /remote/data /local/backup"
仅补全缺失文件(不检查更新)
mirror --no-recursion --no-overwrite /remote/dir /local/dir
注意事项
-
时间戳同步:
- 使用
-k
或--keep-time
保留远程文件时间戳,确保校验准确:mirror -k /remote/dir /local/dir
- 使用
-
字符编码问题:
- 若文件名含中文,需提前设置编码避免跳过错乱:
set ftp:charset UTF-8 set file:charset UTF-8
- 若文件名含中文,需提前设置编码避免跳过错乱:
-
排除临时文件:
- 结合
--exclude
过滤无关文件,减少无效传输:mirror --exclude "*.tmp" --exclude ".DS_Store" /remote/dir /local/dir
- 结合
通过上述方法,可高效实现「增量下载」,避免重复传输已存在的文件。
4. 高级功能
断点续传
- 默认启用,中断后重新执行
get
或put
命令会自动续传。 - 强制重新传输:
get -c remote_file.txt # -c 表示续传
多线程传输
- 启用多线程(加速大文件传输):
set cmd:parallel 5 # 使用 5 个线程 get large_file.iso
镜像同步
- 下载远程目录:
mirror /remote/dir /local/dir
- 仅同步新文件:
mirror --only-newer /remote/dir /local/dir
- 仅同步新文件:
- 同步并删除本地多余文件:
mirror --delete /remote/dir /local/dir
后台任务管理
- 后台传输:
get large_file.iso &
- 查看后台任务:
jobs
- 等待任务完成:
wait <job_id>
5. 配置文件优化
配置文件路径
- 全局配置:
/etc/lftp.conf
- 用户配置:
~/.lftprc
或~/.config/lftp/rc
常用配置项
- 设置默认传输线程数:
set cmd:parallel 3
- 启用被动模式(解决 FTP 连接问题):
set ftp:passive-mode yes
- 限制传输速率(单位:字节/秒):
set net:limit-rate 204800 # 限速 200KB/s
- 自动重试连接:
set net:max-retries 5 # 最大重试次数 set net:reconnect-interval-base 30 # 重试间隔(秒)
书签管理
- 添加书签:
bookmark add myserver sftp://user:pass@example.com:22/path/to/dir
- 使用书签连接:
lftp myserver
6. 注意事项
路径问题
- 本地路径:以
/
或./
开头表示绝对或相对路径。 - 远程路径:默认从用户根目录开始,建议使用绝对路径(如
/var/www
)。
协议差异
- FTP:可能需要被动模式(
set ftp:passive-mode yes
)。 - SFTP:支持密钥认证:
open sftp://user@example.com -p 22 # 自动读取 ~/.ssh/id_rsa 私钥
权限与所有权
- SFTP 可修改权限(
chmod
),但 FTP 通常依赖服务器配置。 - 上传文件默认权限由服务器决定(通常 umask 控制)。
日志与调试
- 启用传输日志:
set xfer:log yes set xfer:log-file ~/lftp.log
- 调试连接问题:
set debug yes # 显示详细网络交互
7. 典型场景示例
批量上传所有 .log 文件
lftp sftp://user:pass@example.com
cd /remote/logs/
mput /local/logs/*.log
exit
定时同步目录(脚本)
创建脚本 sync.sh
:
#!/bin/bash
lftp -c "open -u user,pass sftp://example.com; mirror -R --delete --parallel=5 /local/web/ /remote/web/"
添加到 crontab:
0 3 * * * /path/to/sync.sh # 每天凌晨 3 点执行
8. 常见问题解决
连接超时
- 检查防火墙或安全组设置。
- 尝试切换主动/被动模式:
set ftp:passive-mode on/off
证书错误(SFTP/HTTPS)
- 忽略证书验证(不推荐):
set ssl:verify-certificate no
中文乱码
- 设置字符编码:
set file:charset UTF-8 set ftp:charset GBK
配置文件地址:/etc/lftp.conf
掌握以上内容后,lftp
可替代图形化工具(如 FileZilla),尤其适合需要自动化或处理大量数据传输的场景。建议通过 man lftp
或 help
命令查看完整文档。