为什么 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 年还是个麻烦:

  1. 没有加密。 每一个字节——用户名、密码、文件内容——在网络上都是裸奔的明文。只要有人在网络上抓个包,你的凭据就直接送人。
  2. 双连接模型 让 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) 里切换:

Bash
ftp> passive
Passive mode on.
ftp> passive
Passive mode off.

如果你被困在企业防火墙后面、它对外向连接卡得很死,passive 是你朋友。如果你身后是个对连接追踪很严格的 NAT,passive 八成还是你朋友——先试这个。

主动模式在 2026 年几乎只剩一个正经用途:调试那些不支持 PASV 的老 FTP 守护进程。别的场景就别用它了。

连接与认证

最直接的场景:

Bash
$ 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,密码随便填(按惯例填你的邮箱,但基本没人真的去校验):

Bash
$ 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 退出

mgetmput 在远端走 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。
  • 本机到本机复制:scprsync 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:

  1. vsftpd 或 ProFTPd,别用上古的 wu-ftpd。前者近期的补丁都跟得上现在的网络环境。
  2. 强迫症的话跑非默认端口。挡不住死磕的攻击者,但能减少路过型扫描。
  3. 客户端范围固定的话,强开 chroot 锁本机用户。阻止用户跳出自己 home 目录乱逛。

Don’t:

  1. 别在没 TLS 的情况下用明文 FTP 传凭据。真要暴露 FTP,至少要求 FTPS(FTP-over-TLS,RFC 4217)——同一套协议,外面套一层 TLS 包裹控制通道。每个现代 FTP 服务器都支持,lftp 一行配置就能上 FTPS。
  2. 除非数据本来就该是公开的,否则别开匿名模式。老模板默认就启用了匿名,用不上就关掉。
  3. 别把 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 协议规范

来源:参考 https://www.ltsplus.com/linux/linux-ftp-command

最后修改: 2026年7月11日

作者

评论

发表评论

您的邮箱地址不会被公开。