为什么 Linux 还在出厂自带 ftp(1)(以及它 2026 年到底还能干嘛)
在一台刚装好的 Debian 12 上敲一句 which ftp。命令在。问为什么,每个老 sysadmin 给你的答案几乎一样:
“因为 /usr/bin/ftp(1) 是 POSIX 规定的,谁也不用了。大家现在全走 SSH。”
这答案对了一大半。但只对一半。因为只要你哪天接上一台老 NAS、跟一个嵌入式工控机打交道、或者被困在只放行历史协议的企业代理后面,FTP 总会在某个意想不到的时刻冒出来。而真到了那一步,man page 是不留情面的。
下面就是 ftp(1) 真正能干啥、它哪里不行、以及该用什么去替代它。
ftp 到底是什么
ftp 是基于 FTP 协议(RFC 959,1985 年起草)实现的一个 可移植的文件传输客户端。它支持两种传输模式——ASCII 和 binary——走的是两条通信通道,并且在这两条通道上全是明文。
两个原因让 FTP 在 2026 年还是个麻烦:
- 没有加密。 每一个字节——用户名、密码、文件内容——在网络上都是裸奔的明文。只要有人在网络上抓个包,你的凭据就直接送人。
- 双连接模型 让 NAT 和防火墙头疼。FTP 有一条连接专门跑命令,然后每次传数据再 单独开一条。现代网络边界(NAT、状态检测防火墙、云负载均衡)处理这套机制非常糟糕。这就是为什么大家都说”FTP 一过路由器就坏”。
那它凭啥还出厂自带?
因为 有些设备只会 FTP。老式备份机、医疗设备、CNC 控制器、IPMI 固件更新器、廉价 IP 摄像头——它们就只暴露 FTP,而且 只 暴露 FTP。你要跟它们打交道的时候,就只能打开终端敲一句 ftp。
双连接模型(劝退所有人的那一块)
FTP 用 21 端口跑命令(控制通道),然后 每次传文件再单独开一个临时端口(数据通道)。两种模式的差别,就在数据端口是谁开的:
主动模式是老派玩法。服务器 反连回客户端 的某个高端口做数据传输。这套在 1990 年还能打——那时候两边都有公网 IP,能直接寻址。2026 年,客户端的高端口躲在 NAT 后面,连接根本打不通。你会看到 425 Can't open data connection,然后一脸懵。
被动模式(现代客户端的默认)是补丁。服务器告诉客户端”你来连我这个端口”,客户端主动发起这条连接。数据流从客户端视角是出站的,跟命令通道方向一致,NAT 就能正常处理。
在 ftp(1) 里切换:
ftp> passive
Passive mode on.
ftp> passive
Passive mode off.如果你被困在企业防火墙后面、它对外向连接卡得很死,passive 是你朋友。如果你身后是个对连接追踪很严格的 NAT,passive 八成还是你朋友——先试这个。
主动模式在 2026 年几乎只剩一个正经用途:调试那些不支持 PASV 的老 FTP 守护进程。别的场景就别用它了。
连接与认证
最直接的场景:
$ ftp 192.168.1.100
Connected to 192.168.1.100.
220 (vsFTPd 3.0.5)
Name (192.168.1.100:you): your_user
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
ftp>那个 ftp> 提示符就是一个小解释器的入口。一行一条命令。你也可以从 stdin 往里灌命令——这就是 ftp 能写脚本的诀窍。
匿名服务器(公共镜像、发行版 ISO 站、归档站)接受用户名为 anonymous,密码随便填(按惯例填你的邮箱,但基本没人真的去校验):
$ ftp ftp.kernel.org
Name: anonymous
Password: guest@example.com现在有些站点会拒掉这种访问。Debian 在 2017 年彻底关掉了匿名 FTP,Red Hat 也是。如果你在 2026 年维护一个 FTP 服务器,匿名对大多数场景都不合适;如果你只是客户端,你大概率也碰不到它。
真正会用到的八条命令
现代 ftp(1) 大概有 60 条命令,实际需要的也就八条。剩下的就是 vim 式的冗长语法,基本只有老管理员还记得。
| Command | 作用 |
|---|---|
ls / cd |
列远端目录 / 切换远端目录 |
lcd |
切换本机目录 |
get <file> |
下载一个文件 |
put <file> |
上传一个文件 |
mget <glob> |
下载一批匹配 pattern 的文件 |
mput <glob> |
上传一批匹配 pattern 的文件 |
binary |
切到 binary 模式(8 位干净——压缩文件、可执行文件、图片用这个) |
prompt |
切换 mget/mput 的确认提示(prompt off 关掉询问) |
delete <remote> |
删除远端文件 |
bye |
退出 |
mget 和 mput 在远端走 shell 通配做匹配。经典坑点:有人跑 mget *.pdf 拿到 NLST doesn't support wildcard——这是因为服务器的 NLST 命令(ftp 版的 ls)本身不做通配。你要么换一台支持更现代 MLSD 的服务器,要么就先 ls /path/ 一下,手挑出文件名,再喂回去。
ASCII 模式是默认的,它会骗你。ASCII 模式会把二进制文件(PDF、.tar.gz、任何压缩格式)搞坏——有一类经典 bug 就是下载下来的 tar 包”看着只有一点点损坏”,其实是换行符被转换了。任何要传压缩文件、可执行文件、图片之前,先敲一遍 binary 切到 binary 模式。一个会话切一次就够了,零成本。
该用什么替代
老实说:
- 涉及任何敏感数据:
sftp。 SFTP 是基于 SSH 的文件传输协议。所有流量全加密。用户名、密码走加密通道。服务器身份靠 SSH 主机密钥确认。只要目标有 SSH,就用 SFTP。工具:sftp(OpenSSH)、lftp、Nautilus、Cyberduck。 - 本机到本机复制:
scp或rsync。 scp 跑一次性复制还行。rsync 才是要跑第二遍以上时的正解——它做增量传输,断点也能续。 - 得”假装是 FTP”跟老端点对接的自动化:
curl ftp://行,wget ftp://也行。需要写脚本的时候lftp最强——它的脚本语法甩 ftp(1) 几条街。 - 要新开服务器:别开 FTP。 跑 OpenSSH 守护进程挂出来的 SFTP,或者
lftp服务器,或者客户端是 Windows 就用 SMB。生产里那些真的换不成 SFTP 的 FTP 守护进程,数量少而且越来越少了。
常见 FAQ——”我就是想从这台老设备上拽一个文件”——通常的解决套路就是敲 ftp(1)、切 binary 模式、get 一下、bye 退出,前后两分钟。这种用例 ftp 还能顶。别的就不行了。
ftp(1) 还能凑合用的情况
对称的反例,ftp(1) 还能发光发热的场景:
- 从厂商只开放 FTP 的更新服务器下固件包。 有些嵌入式厂商至今还在这么发更新;你开个 ftp,拽完 .bin,走人。
- 调试一个只支持 FTP 的网络共享。 排查别人的设备、而那台机器只会 FTP 的时候,ftp(1) 是个足够好的诊断客户端。
- “OpenSSL 阵亡”那几天恢复用。 SSH、TLS 库都坏了好几周的情况,历史上发生过。ftp 的明文简洁救场——加密库一着火它照样跑。(这种事真发生过,以后还会再发生。)
- 跟工业 CNC、实验设备、医学影像设备打交道。 这些设备的协议栈基本不更新,服役期内都会跑 FTP。
每种场景下的元建议都一样:用一次,把文件拿下来,断开。别把它整成日常流程的一部分。
加固:真的非开 FTP 服务器不可的话
三条做,三条不做。
Do:
- 用
vsftpd或 ProFTPd,别用上古的wu-ftpd。前者近期的补丁都跟得上现在的网络环境。 - 强迫症的话跑非默认端口。挡不住死磕的攻击者,但能减少路过型扫描。
- 客户端范围固定的话,强开 chroot 锁本机用户。阻止用户跳出自己 home 目录乱逛。
Don’t:
- 别在没 TLS 的情况下用明文 FTP 传凭据。真要暴露 FTP,至少要求 FTPS(FTP-over-TLS,RFC 4217)——同一套协议,外面套一层 TLS 包裹控制通道。每个现代 FTP 服务器都支持,
lftp一行配置就能上 FTPS。 - 除非数据本来就该是公开的,否则别开匿名模式。老模板默认就启用了匿名,用不上就关掉。
- 别把 FTP 暴露到公网。真要暴露文件传输,就暴露 FTPS 或 SFTP。FTP 公开后几小时内就会被暴力破解。
收尾
ftp(1) 是这么个工具:它存在,有它的位置,不该是你的默认选项。打开终端,敲一次 ftp,拿完你要的东西,敲 bye。该干嘛干嘛去。
如果你发现自己每天都去够它,那是个信号:你的基础设施落后了十年——解法是协议迁移,不是去研究更好的 FTP 参数。
资料:
- vsftpd — Very Secure FTP Daemon,Linux 上的标准选择
- proftpd — 类 Apache 配置文件的 FTP 服务器
- lftp — 高级 FTP/FTPS/SFTP/HTTP 客户端,脚本能力完整
- curl FTP — 用 curl 跑一次性的 FTP 传输,定时任务和脚本里好用
- RFC 959 — 原始 FTP 协议规范
评论