目录
- [一. 简介](#一. 简介)
- [二. 环境准备](#二. 环境准备)
-
- [2.1 准备SFTP服务器](#2.1 准备SFTP服务器)
- [2.2 安装`lftp`命令](#2.2 安装
lftp命令)
- [二. 连接SFTP服务器](#二. 连接SFTP服务器)
-
- [2.1 手动输入密码连接](#2.1 手动输入密码连接)
- [2.2 免密码连接](#2.2 免密码连接)
-
- [2.2.1 配置`.netrc`文件](#2.2.1 配置
.netrc文件) - [2.2.2 密钥连接](#2.2.2 密钥连接)
-
- [2.2.2.1 使用默认位置的私钥](#2.2.2.1 使用默认位置的私钥)
- [2.2.2.2 使用指定位置的私钥](#2.2.2.2 使用指定位置的私钥)
- [2.2.3 配置config文件](#2.2.3 配置config文件)
- [2.2.1 配置`.netrc`文件](#2.2.1 配置
- [2.3 交互式shell的方式连接](#2.3 交互式shell的方式连接)
- [2.4 开启debug模式,查看连接的详情](#2.4 开启debug模式,查看连接的详情)
- [三. 将文件从sftp服务器下载到本地指定目录](#三. 将文件从sftp服务器下载到本地指定目录)
-
- [3.1 配合config文件](#3.1 配合config文件)
- [3.2 指定私钥的方式下载](#3.2 指定私钥的方式下载)
- [3.3 镜像模式下载](#3.3 镜像模式下载)
一. 简介
⏹命令行简介
- lftp 是一个功能强大的命令行 FTP 客户端程序,它支持多种协议(包括 FTP、FTPS、SFTP 等),可以用于文件传输和管理。
- lftp 提供了丰富的功能,包括下载、上传、目录操作、文件搜索、断点续传、并行传输等。它可以处理多个连接和任务,并支持脚本化操作。
- 适用于需要进行大量文件传输、批量处理或自动化操作的情况,例如备份、同步、批量下载等。
二. 环境准备
2.1 准备SFTP服务器
⏹参照下面这篇博客,在安卓手机上安装Termux,配置完成之后,就开启了SFTP服务器功能。
2.2 安装lftp命令
bash
sudo apt install lftp
二. 连接SFTP服务器
2.1 手动输入密码连接
bash
lftp sftp://u0_a362@192.168.3.23:8022
lftp -p 8022 sftp://u0_a362@192.168.3.23

2.2 免密码连接
2.2.1 配置.netrc文件
⏹.netrc 是一个 用于存储远程主机登录信息的配置文件,主要作用就是 免去每次输入用户名和密码,让像 ftp、lftp、curl 等客户端程序自动登录远程服务器。
bash
apluser@FengYeHong-HP:~$ cat .netrc
machine 192.168.3.23
login u0_a362
password apluser
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ lftp -p 8022 sftp://u0_a362@192.168.3.23
lftp u0_a362@192.168.3.23:~>
lftp u0_a362@192.168.3.23:~> ls -l
drwx------ 5 u0_a362 u0_a362 3488 Nov 30 19:41 .
drwxrwx--x 4 u0_a362 u0_a362 3488 Nov 25 08:27 ..
-rw------- 1 u0_a362 u0_a362 3439 Dec 7 13:11 .bash_history
-rw------- 1 u0_a362 u0_a362 671 Nov 30 19:54 .bashrc
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:35 .ssh
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:27 .termux
-rw------- 1 u0_a362 u0_a362 20 Nov 25 08:46 .termux_authinfo
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:33 storage
lftp u0_a362@192.168.3.23:~>
2.2.2 密钥连接
⏹生成密钥以及配置到目标sftp服务器的方法已经在 linux sftp命令 文章中简介过,此处不在赘述。
- 两台服务器的密钥配置情况如下图所示

2.2.2.1 使用默认位置的私钥
- 不手动指定私钥位置的话,会默认使用当前用户
~/.ssh/下的私钥去连接SFTP服务器 - 需要注意的是,我们如果不指定密码的话,即使使用密钥去连接,依然会提示我们输入密码
- 此时,哪怕我们直接敲一个回车或者输入一个错误的密码,依然可以成功连接SFTP服务器
bash
# 方式一: 没有指定密码
lftp -p 8022 sftp://u0_a362@192.168.3.23
# 方式二: 指定一个假的密码
lftp -p 8022 sftp://u0_a362:DUMMY@192.168.3.23
# 方式三: 指定用户名, 这种方式相当于指定密码为空
lftp -u u0_a362, -p 8022 sftp://192.168.3.23

2.2.2.2 使用指定位置的私钥
⏹如下图所示,将~/.ssh/下的私钥重命名之后,在没有手动指定密钥的情况下,登录SFTP服务器失败。

-e:先指定-e参数里面的命令,然后进入交互模式ssh -a- 禁用 SSH agent forwarding 功能
- 就是禁止把你本地的 ssh-agent(本地密钥代理)转发到远程机器
- 这样远程机器无法使用你本地的 SSH agent 来连接其它服务器
ssh -x- 禁止
X11转发 X11转发允许你通过 SSH 运行远程图形程序,并把界面显示到本地X11转发在服务器端或 Termux 这种无图形环境下完全不需要
- 禁止
bash
lftp -u u0_a362, sftp://192.168.3.23:8022 -e 'set sftp:connect-program "ssh -a -x -i /home/apluser/.ssh/id_ed25519_bk"'
lftp -u u0_a362, sftp://192.168.3.23:8022 -e 'set sftp:connect-program "ssh -a -x -i /home/apluser/work/id_ed2551999"'

2.2.3 配置config文件
- 配置好
config文件之后,可直接通过lftp sftp://termux进行登录。
bash
apluser@FengYeHong-HP:~$ cat ~/.ssh/config
Host termux
HostName 192.168.3.23
User u0_a362
Port 8022
IdentityFile /home/apluser/.ssh/id_ed25519_bk
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ lftp sftp://termux
lftp termux:~> ls
drwx------ 5 u0_a362 u0_a362 3488 Nov 30 19:41 .
drwxrwx--x 4 u0_a362 u0_a362 3488 Nov 25 08:27 ..
-rw------- 1 u0_a362 u0_a362 3716 Dec 7 18:36 .bash_history
-rw------- 1 u0_a362 u0_a362 671 Nov 30 19:54 .bashrc
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:35 .ssh
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:27 .termux
-rw------- 1 u0_a362 u0_a362 20 Nov 25 08:46 .termux_authinfo
drwx------ 2 u0_a362 u0_a362 3488 Nov 25 08:33 storage
lftp termux:~>
2.3 交互式shell的方式连接
- 先通过
lftp命令进入交互模式 - 然后通过
set sftp:connect-program命令加载私钥 - 最后在通过open命令,指定sftp服务器的用户名和端口号的方式进入sftp服务器

2.4 开启debug模式,查看连接的详情
lftp -d:- 开启debug模式
- -d 会让 lftp 输出大量调试信息,包括连接、握手、命令执行、错误原因等等。
ssh -v:- 输出 SSH 详细调试(握手、认证、密钥匹配等)
bash
lftp -d -c "set sftp:connect-program 'ssh -v -a -x -i /home/apluser/.ssh/id_ed25519_bk';
open -u u0_a362, -p 8022 sftp://192.168.3.23;
ls"

三. 将文件从sftp服务器下载到本地指定目录
3.1 配合config文件
-c:用于执行一系列指定的命令,然后退出。
这对于需要在脚本或命令行中执行一组自动化文件传输操作非常有用。- 多个命令之间使用
;来分隔,表示按照顺序执行这些命令 set net:max-retries 1:设置最大重试次数为 1mget:批量下载文件-O:指定下载到的本地目录- 注意:是英文大写的
O,并不是数字0
- 注意:是英文大写的
sleep 1:暂停 1 秒,确保 lftp 命令执行完成后再退出
bash
lftp -c "
set net:max-retries 1;
open sftp://termux;
mget '/data/data/com.termux/files/home/storage/downloads/*.apk' -O /home/apluser/download/;
sleep 1
"

3.2 指定私钥的方式下载
- 当指定错误的私钥的时候,显示登录失败
- 当指定正确的密钥之后,文件被成功下载到本地
bash
lftp -c "set sftp:connect-program 'ssh -a -x -i /home/apluser/.ssh/id_ed25519_bk';
open -u u0_a362, -p 8022 sftp://192.168.3.23;
mget '/data/data/com.termux/files/home/storage/downloads/*.apk' -O /home/apluser/download/;"

3.3 镜像模式下载
lcd:移动到客户端的指定目录cd:移动到服务器的指定目录mirror:镜像模式-e:按 mirror 模式,删除本地的多余文件,使其和远程服务器的指定目录相同-v:verbose,显示详细信息
- 此镜像模式是将服务器的文件镜像到本地,如果想让本地的文件镜像到服务器的话,需要使用
-R配置项mirror -Rev:反向同步(本地 → 远程)上传- 💥把本地目录
/home/apluser/download/里的内容上传到远程目录
💥并删除远程download/目录中本地没有的文件
bash
lftp -c "set sftp:connect-program 'ssh -a -x -i /home/apluser/.ssh/id_ed25519_bk';
open -u u0_a362, sftp://192.168.3.23:8022;
lcd /home/apluser/download/;
cd /data/data/com.termux/files/home/storage/downloads/;
mirror -ev"
