在 Linux 中使用 ftp 命令传输文件:连接、下载、上传与被动模式实战

FTP(文件传输协议,File Transfer Protocol)是一种用于将文件传入和传出远程服务器的标准网络协议。虽然 FTP 已被安全的替代方案大量取代,但命令行 ftp 客户端在访问遗留服务器和受控环境中的自动化传输时仍然有用。

本指南介绍如何使用 Linux ftp 命令连接到远程服务器、下载文件和上传文件。

快速参考

关于可打印的快速参考,请参阅 FTP 速查表。

命令说明
ftp hostname连接到 FTP 服务器
get file下载单个文件
get file newname下载文件并以新名称保存
put file上传单个文件
put file newname上传文件并以新名称存储
mget *.txt下载多个文件
mput *.txt上传多个文件
lcd /path切换本地目录
cd /path切换远程目录
ls列出远程目录内容
binary切换到二进制传输模式
ascii切换到 ASCII 传输模式
passive切换被动模式(默认开启)
status显示当前模式与设置
prompt切换 mget / mput 的逐文件确认
bye or quit关闭连接

开始之前

FTP 流量(包括凭据)以明文传输,未加密。对于安全的文件传输,请改用 SCP 或 SFTP。

要传输文件,你必须至少对源文件具有读取权限,并对目标系统具有写入权限。

传输大文件时,建议在 screen 或 tmux 会话中运行 ftp 命令。

运行 ftp 命令所在的目录即本地工作目录。

安装 ftp 客户端

ftp 命令并非总是已安装,尤其是在最小化镜像和云镜像上。如果运行 ftp 返回 command not found,请为你的发行版安装客户端软件包。

Ubuntu、Debian 及其衍生版

sudo apt update

sudo apt install ftp

在当前 Ubuntu 和 Debian 版本上,ftp 是一个安装 tnftp(来自 NetBSD 的 FTP 客户端)的过渡软件包。ftp 命令实际运行 tnftp,因此本指南中的所有命令行为一致。

Fedora、RHEL 及其衍生版

sudo dnf install ftp

Fedora 的 ftp 软件包安装的是 Netkit 客户端。下面的示例和输出使用的是 tnftp(按 Ubuntu 和 Debian 上的安装方式)。基本的传输命令在两种客户端中均可工作,但 URL 下载、progress 命令以及 a / q 确认响应需要 tnftp。

建立 FTP 连接

要连接到远程 FTP 服务器,请运行 ftp 命令,后接服务器 IP 地址或域名:

ftp 192.168.42.77

如果连接建立,服务器会发送 220 欢迎消息,并提示你输入 FTP 用户名:

Connected to 192.168.42.77.
220 (vsFTPd 3.0.5)
Name (192.168.42.77:localuser): linuxize

欢迎文本取决于 FTP 服务器软件。括号中的名称是你的本地用户名,如果你直接按回车而不输入名称,客户端会使用它。

输入用户名后,在提示符处输入你的密码:

331 Please specify the password.
Password:

如果凭据正确,服务器会显示确认消息和 ftp> 提示符:

230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

传输模式:二进制 vs ASCII

FTP 支持两种传输模式:

• 二进制模式:逐字节传输文件,不做修改。用于图像、归档、可执行文件以及任何非文本文件。 • ASCII 模式:在系统之间转换行尾(例如 Windows 上的 \r\n 转换为 Linux 上的 \n)。仅用于纯文本文件。

大多数现代 FTP 客户端默认使用二进制模式。要在 ftp> 提示符下切换模式:

binary
ascii

传输非文本文件时始终使用二进制模式。以 ASCII 模式传输二进制文件会损坏它。

下载文件

一旦登录,你的当前工作目录就是远程用户主目录。文件被下载到你启动 ftp 命令的本地目录。

要将文件下载到不同的本地目录,请使用 lcd 命令:

lcd ~/Downloads
Local directory now: /home/localuser/Downloads

下载单个文件

使用 get 命令从远程服务器下载文件:

get backup.zip
local: backup.zip remote: backup.zip
229 Entering Extended Passive Mode (|||6948|)
150 Opening BINARY mode data connection for backup.zip (6673256 bytes).
100% |***********************************|  6516 KiB  888.34 MiB/s    00:00 ETA
226 Transfer complete.
6673256 bytes received in 00:00 (864.10 MiB/s)

229 行显示客户端以被动模式打开了数据连接。进度条跟踪下载,最后一行报告接收到的字节数和传输速率。

要以不同的本地名称保存文件,请将新名称作为第二个参数传入:

get backup.zip backup-old.zip

输出的第一行确认了两个名称:

local: backup-old.zip remote: backup.zip

下载多个文件

使用 mget 命令下载多个文件。你可以指定单个文件名或使用通配符:

mget backup1.zip backup2.zip

默认情况下,mget 会对每个文件提示确认:

mget backup1.zip [anpqy?]? y
229 Entering Extended Passive Mode (|||53270|)
150 Opening BINARY mode data connection for backup1.zip (7415 bytes).
100% |***********************************|  7415       58.92 MiB/s    00:00 ETA
226 Transfer complete.
7415 bytes received in 00:00 (7.29 MiB/s)
mget backup2.zip [anpqy?]? y
229 Entering Extended Passive Mode (|||16943|)
150 Opening BINARY mode data connection for backup2.zip (1415 bytes).
100% |***********************************|  1415       23.26 MiB/s    00:00 ETA
226 Transfer complete.
1415 bytes received in 00:00 (4.81 MiB/s)

输入 y 下载文件,或输入 n 跳过它。在 tnftp 中,输入 a 下载当前文件及所有剩余文件且不再询问,输入 q 停止整个 mget 操作。

要禁用逐文件确认提示,请在使用 mget 之前运行 prompt:

prompt
Interactive mode off.

再次运行 prompt 可重新启用确认。

上传文件

上传单个文件

使用 put 命令将文件上传到远程服务器:

put image.jpg
local: image.jpg remote: image.jpg
229 Entering Extended Passive Mode (|||16601|)
150 Ok to send data.
100% |***********************************| 96936      208.67 MiB/s    00:00 ETA
226 Transfer complete.
96936 bytes sent in 00:00 (135.54 MiB/s)

要从不同的本地目录上传文件,请使用其绝对路径。

要以不同的名称在服务器上存储文件,请在本地名称后添加远程名称:

put image.jpg photo.jpg
local: image.jpg remote: photo.jpg
229 Entering Extended Passive Mode (|||19516|)
150 Ok to send data.
100% |***********************************| 96936      478.99 MiB/s    00:00 ETA
226 Transfer complete.
96936 bytes sent in 00:00 (154.33 MiB/s)

本地的 image.jpg 现在以 photo.jpg 的名称保存在远程目录中。如果服务器上已存在同名文件,它将被覆盖。

上传多个文件

使用 mput 命令上传多个文件:

mput image1.jpg image2.jpg

与 mget 类似,mput 命令会对每个文件提示确认。使用 prompt 可关闭此行为。

被动模式

FTP 使用两个连接。命令通过端口 21 上的控制连接传输,而每次文件传输或目录列表都会打开一个单独的数据连接。

在主动模式下,服务器主动向客户端发起数据连接。当客户端位于 NAT 路由器或防火墙后面时,这通常会失败,因为入站连接被阻止。在被动模式下,客户端发起控制连接和数据连接。

Ubuntu、Debian 和 Fedora 上的 ftp 客户端以被动模式启动,如果服务器不支持则回退到主动模式。传输输出中的 229 Entering Extended Passive Mode 一行确认正在使用被动模式。

要检查当前模式,请使用 status 命令:

status
Connected and logged into 192.168.42.77.
No proxy connection.
Gate ftp: off, server (none), port ftpgate.
Passive mode: on; fallback to active mode: on.
Mode: stream; Type: binary; Form: non-print; Structure: file.
...

passive 命令切换模式。由于被动模式已开启,运行它会将客户端切换到主动模式:

passive
Passive mode: off; fallback to active mode: off.

再次运行 passive 可切换回去。你也可以在连接时设置模式。-A 选项强制主动模式,-p 启用被动模式:

ftp -A 192.168.42.77

你仅在旧服务器不接受被动连接时才需要主动模式。

关闭连接

完成后,使用 bye 或 quit 关闭 FTP 连接:

quit
221 Goodbye.

FTP 传输脚本化

使用 tnftp,你可以通过在命令行传入其 FTP URL 来下载文件。这无需在 ftp> 提示符下输入任何内容即可在 shell 脚本或 cron 作业中工作。本节中的 URL 示例需要 tnftp;Fedora 的 Netkit 客户端不支持它们。

要在没有密码提示的情况下登录,请将凭据存储在主目录中的 .netrc 文件中:

machine 192.168.42.77

login linuxize

password your_password

如果其他用户可以读取包含密码的 .netrc 文件,客户端会拒绝使用它。请将文件权限设置为 600:

chmod 
600
 ~/.netrc

如果你跳过此步骤,自动登录会失败并报:

ftp: Error: .netrc file is readable by others
ftp: Remove password or make file unreadable by others

有了 .netrc 文件后,以下脚本使用 tnftp 的 URL 自动获取模式将备份文件下载到 ~/Downloads:

#!/bin/sh



cd
 ~/Downloads 
||
 
exit
 
1




ftp ftp://linuxize@192.168.42.77/backup.zip

客户端从匹配的 .netrc 条目读取密码,并以二进制模式传输文件。如果下载失败,URL 自动获取会返回非零退出状态,该状态会成为脚本的退出状态。通过 here document 向进程传入 get 和 bye 无法提供此检查:即使在传输失败后,bye 也可能返回状态 0。

当输出不发送到终端时(如在 cron 作业中),ftp 不打印进度条和服务器响应。成功的传输不会产生任何输出。

你也可以直接在终端中运行 URL 命令。它会登录、将文件下载到当前目录并退出:

ftp ftp://linuxize@192.168.42.77/backup1.zip
Connected to 192.168.42.77.
220 (vsFTPd 3.0.5)
331 Please specify the password.
230 Login successful.
...
local: backup1.zip remote: backup1.zip
229 Entering Extended Passive Mode (|||28040|)
150 Opening BINARY mode data connection for backup1.zip (7415 bytes).
226 Transfer complete.
7415 bytes received in 00:00 (54.81 MiB/s)
221 Goodbye.

有了匹配的 .netrc 条目,客户端会自动提供密码。否则,它会提示你输入。URL 中的路径相对于 FTP 用户的登录目录。不要把密码放在 URL 中;它会被保存到你的 shell 历史记录中,并在进程列表中对其他用户可见。

常用 FTP 命令

命令说明
help or ?列出所有可用 FTP 命令
cd directory切换远程目录
lcd directory切换本地目录
ls列出当前远程目录中的文件
pwd打印当前远程工作目录
mkdir directory在远程服务器上创建目录
delete file删除远程服务器上的文件
rmdir directory删除远程服务器上的目录
rename old new重命名远程服务器上的文件
status显示当前连接与传输设置
hash切换传输过程中的哈希标记显示
progress切换传输进度条(仅 tnftp)

故障排查

Connection refused 或 timed out FTP 服务器可能未运行、端口可能被防火墙阻止,或者 IP 地址不正确。请确认服务器正在监听端口 21,且你的防火墙允许对其的出站连接。

ftp: connect: No route to host 网络层问题正在阻止连接。检查你的网络连接和 DNS 解析。

Transfer hangs or times out after connecting successfully 数据连接被阻止。运行 status 并检查 Passive mode 行。如果被动模式已关闭,NAT 路由器或防火墙可能正在阻止服务器回连到你的客户端;运行 passive 重新开启。如果被动模式已开启,服务器的防火墙可能正在阻止其用于被动连接的端口范围,需要服务器管理员打开它。

Downloads fail with "Permission denied" 在 Ubuntu 25.10 及更高版本上,即使你拥有本地目录,错误也如下所示:

ftp: Can't open `backup.zip': Permission denied

客户端的 AppArmor 配置仅允许下载到你的主目录、~/Downloads、~/Desktop、~/tmp 和 /tmp。请在下载前使用 lcd ~/Downloads,或通过将规则添加到本地覆盖文件来允许另一个目录:

echo
 
'owner @{HOME}/backups/** rw,'
 
|
 sudo tee -a /etc/apparmor.d/local/tnftp

sudo apparmor_parser -r /etc/apparmor.d/tnftp

将 backups 替换为你想使用的目录。该更改在下一次 ftp 会话时生效。

Downloaded file is corrupted or has wrong size 文件很可能以 ASCII 模式而非二进制模式传输。在下载非文本文件前运行 binary。

mget 或 mput 对每个文件都要求确认 运行 prompt 以切换关闭交互式确认。这在一次下载或上传许多文件时尤其有用。

常见问题

FTP 仍然安全可用吗?FTP 以明文传输数据和凭据。它只应在受信任的网络上或用于非敏感数据。对于安全传输,请使用 SFTP 或 SCP。

FTP 与 SFTP 有什么区别?FTP 是一种使用端口 21 的未加密协议。SFTP 运行在 SSH(端口 22)之上,并加密所有数据和凭据。尽管名称相似,它们是完全不同的协议。

如何在无需逐文件提示的情况下传输文件?在 ftp> 提示符下运行 prompt 以禁用交互模式。之后,mget 和 mput 将传输所有匹配的文件而无需确认。

主动与被动 FTP 模式有什么区别?在主动模式下,服务器为数据传输回连客户端,这在防火墙或 NAT 后面通常会失败。在被动模式下,客户端发起两个连接,使其与现代网络设置更兼容。当前 Linux 发行版上的 ftp 客户端默认使用被动模式。

如何使用 ftp 下载整个目录?ftp 客户端无法递归下载目录。mget * 命令仅下载当前远程目录中的文件,并跳过子目录。要复制完整的目录树,请使用 wget,例如 wget -r -l inf --user=linuxize --ask-password ftp://192.168.42.77/public_html/,或 lftp 中的 mirror 命令。使用 Wget 时,-r 启用递归,-l inf 移除默认的五级目录限制。

结论

ftp 命令提供了一种将文件传入和传出远程服务器的直接方式。对于不可信网络上的安全传输,请改用 SFTP 或 SCP。