
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。