ftp 是一个经典的、功能强大的命令行文件传输协议客户端,虽然现在更推荐使用更安全的 sftp(基于 SSH)或 lftp(功能更丰富),但 ftp 仍然是许多系统管理员和用户必备的工具。
ftp 命令启动时的参数
当你直接在终端输入 ftp 命令时,通常会进入交互模式,但你也可以在启动时直接指定参数。
基本连接参数
| 参数 | 全称 | 描述 | 示例 |
|---|---|---|---|
host |
- | 指定要连接的 FTP 服务器的主机名或 IP 地址,这是最常用的方式。 | ftp ftp.example.com |
-A |
anonymous |
以匿名用户身份登录。 | ftp -A ftp.example.com |
-u user |
user |
指定登录用户名。 | ftp -u myuser ftp.example.com |
-p port |
port |
指定连接的端口号,默认为 21。 | ftp -p 2121 ftp.example.com |
调试与输出参数
| 参数 | 全称 | 描述 | 示例 |
|---|---|---|---|
-d |
debug |
启用调试模式,显示客户端与服务器之间发送的所有 FTP 命令,对于排查连接问题非常有用。 | ftp -d ftp.example.com |
-v |
verbose |
冗长模式,在文件传输过程中,会显示服务器的响应信息,默认情况下,mget 和 mput 是静默的。 |
ftp -v ftp.example.com |
-n |
noauto-login |
禁止自动登录,在连接到服务器后,不会提示你输入用户名和密码,需要你手动执行 user 命令,常用于脚本中。 |
ftp -n ftp.example.com |
-i |
prompt |
关闭交互式提示,在执行 mget 或 mput 时,不会对每个文件进行“下载/上传 (y/n)?”的询问。 |
ftp -i ftp.example.com |
安全相关参数
| 参数 | 全称 | 描述 | 示例 |
|---|---|---|---|
-s:file |
script |
指定一个脚本文件,ftp 启动后会自动执行该文件中的命令,非常适合自动化任务。 |
ftp -s:commands.txt ftp.example.com |
-z |
tls |
强制使用 TLS(SSL)加密连接,这是连接到现代、安全 FTP 服务器(如 FTPS)的关键参数。 | ftp -z ftp.example.com |
其他参数
| 参数 | 全称 | 描述 |
|---|---|---|
-g |
glob |
禁用文件名展开(通配符 , 等),在处理文件名中包含特殊字符的文件时很有用。 |
-e |
escape |
对文件名中的特殊字符(如空格)进行转义。 |
进入 ftp> 交互模式后的命令
连接成功后,你会看到 ftp> 提示符,在这里可以输入各种命令来操作远程服务器。
连接与认证类命令
| 命令 | 描述 | 示例 |
|---|---|---|
open <host> [port] |
打开到指定主机和端口的连接。 | open ftp.example.com 21 |
close |
关闭当前连接,但仍留在 ftp> 提示符下。 |
close |
disconnect |
同 close。 |
disconnect |
bye 或 quit |
退出 ftp 客户端。 |
bye |
user <username> [password] |
以指定用户身份登录,如果省略密码,会提示输入。 | user myuser mypass |
anonymous |
快速以匿名用户登录(通常邮箱作为密码)。 | anonymous |
account <password> |
在需要时提供账户密码(如使用 user 命令后服务器要求)。 |
account myacpass |
目录与文件浏览类命令
| 命令 | 描述 | 示例 |
|---|---|---|
pwd |
Print Working Directory,显示当前在远程服务器上的工作目录。 | pwd |
ls [remote-dir] [local-file] |
列出远程服务器上指定目录的内容,如果指定 local-file,则结果会保存到本地文件。 |
ls /pub |
dir [remote-dir] [local-file] |
与 ls 类似,但显示更详细的列表信息(权限、大小、日期等)。 |
dir |
cd <remote-dir> |
Change Directory,切换远程服务器上的目录。 | cd /pub/docs |
lcd <local-dir> |
Local Change Directory,切换本地机器上的目录,所有上传/下载的默认路径都会改变。 | lcd /home/user/downloads |
| 执行本地 shell 命令。 | !ls (列出本地当前目录) |
文件传输类命令
| 命令 | 描述 | 示例 |
|---|---|---|
get <remote-file> [local-file] |
从远程服务器下载一个文件到本地,如果指定 [local-file],则重命名下载的文件。 |
get readme.txt |
mget <remote-files> |
Multiple GET,从远程服务器下载多个文件,支持通配符。 | mget *.zip |
put <local-file> [remote-file] |
从本地上传一个文件到远程服务器,如果指定 [remote-file],则重命名上传的文件。 |
put myreport.pdf |
mput <local-files> |
Multiple PUT,从本地上传多个文件到远程服务器,支持通配符。 | mput *.log |
append <local-file> [remote-file] |
将本地文件追加到远程文件的末尾。 | append notes.txt existing.txt |
ascii |
设置传输模式为 ASCII(文本),用于传输 .txt, .html, .sh 等文件,会自动处理换行符。 |
ascii |
binary |
设置传输模式为 BINARY(二进制),用于传输 .zip, .jpg, .pdf, .exe 等所有非文本文件,必须使用此模式,否则文件会损坏。 |
binary |
hash |
开启/关闭哈希标记显示,传输文件时,每传输 1024 字节会显示一个 号,可以直观地看到传输进度。 | hash |
文件与目录操作类命令
| 命令 | 描述 | 示例 |
|---|---|---|
mkdir <dirname> |
在远程服务器上创建一个新目录。 | mkdir new_folder |
rmdir <dirname> |
在远程服务器上删除一个空目录。 | rmdir old_folder |
delete <remote-file> |
在远程服务器上删除一个文件。 | delete temp.txt |
mdelete <remote-files> |
在远程服务器上删除多个文件,支持通配符。 | mdelete *.tmp |
rename <oldname> <newname> |
在远程服务器上重命名文件或目录。 | rename old.txt new.txt |
!rm <local-file> |
使用本地 shell 的 rm 命令删除本地文件。 |
!rm unwanted.log |
其他实用命令
| 命令 | 描述 | 示例 |
|---|---|---|
status |
显示当前 ftp 会话的各种设置,如传输模式、是否开启 hash、连接信息等。 |
status |
passive 或 passive off |
切换被动/主动模式,如果连接有 NAT 或防火墙问题,切换模式通常能解决,现代服务器多使用被动模式。 | passive |
help 或 |
显示 ftp 命令的帮助信息。 |
help get |
debug |
开启/关闭调试模式(与启动时的 -d 参数作用相同)。 |
debug 3 (数字越大,信息越详细) |
综合示例
示例 1:基本下载
# 1. 连接到匿名 FTP 服务器 $ ftp ftp.gnu.org # 2. 匿名登录,通常会提示输入邮箱作为密码 Name (ftp.gnu.org:your_local_user): anonymous 331 Anonymous login ok, send your complete e-mail address as password Password: # 输入你的邮箱地址,然后回车 # 3. 切换到二进制传输模式,确保文件完整性 ftp> binary # 4. 进入要下载的目录 ftp> cd gnu/bash # 5. 查看目录内容 ftp> ls # 6. 下载一个文件到本地当前目录 ftp> get bash-5.2.tar.gz # 7. 查看本地目录,确认文件已下载 ftp> !ls # 8. 退出 ftp ftp> bye
示例 2:使用脚本自动化上传
假设你有一个 upload_commands.txt 文件,内容如下:
open ftp.example.com
myusername
mypassword
binary
cd /incoming
lcd /home/user/project
put project.zip
bye
执行命令:
$ ftp -s:upload_commands.txt
这个命令会自动读取脚本文件,依次执行其中的命令,完成登录、切换目录、上传文件并退出的全过程,无需任何人工干预。
重要提醒:ftp 的安全性
ftp 协议在传输所有数据(包括用户名和密码)时都是明文的,非常不安全!
在公共网络或不信任的环境中,强烈建议使用以下替代方案:
-
sftp: 基于 SSH 协议,是scp的交互式版本,所有传输都经过加密,这是目前最推荐的文件传输方式。$ sftp user@host
-
lftp: 一个功能极其强大的、支持多种协议(包括 FTP, FTPS, HTTP, SFTP 等)的命令行客户端,它支持队列、后台传输、镜像同步等高级功能,并且默认情况下会尝试使用安全的连接。$ lftp ftp.example.com lftp ftp.example.com:~> user myuser lftp ftp.example.com:~> set ftp:ssl-force on # 强制使用 FTPS lftp ftp.example.com:~> mirror /remote/dir /local/dir
-
scp/rsync: 适合非交互式的、安全的单文件或多文件/目录复制任务。
希望这份详细的指南能帮助你更好地掌握 Linux ftp 命令!
