FTP 雖老,但「斷點續傳、腳本自動化、嵌入式設備、內網大文件傳輸」場景仍不可替代。本文整理 **標準 FTP 命令 (RFC 959) + gFTP/常見客戶端擴展**,按功能分類,附高頻參數、腳本模板、避坑提示,作為運維、開發、測試人員的桌面速查手冊。
會話控制命令
| 命令 | 縮寫 | 說明 | 示例 |
open | | 連接 FTP 服務器 | open 192.168.1.100 21 |
user | | 指定用戶名/密碼/賬戶 | user ftpuser password123 |
login | | 重新登錄 (切換用戶) | login newuser newpass |
close | disconnect | 斷開連接,保留 ftp 提示符 | close |
bye | quit | 斷開並退出 ftp 客戶端 | bye |
! | | 逃逸到本地 Shell 執行命令 (輸入 exit 返回) | ! ls -l |
? | help | 顯示命令幫助 | ? get |
傳輸模式設置 (關鍵:二進制 vs ASCII)
| 命令 | 適用場景 | 警告 |
binary / bi | **所有非文本文件**:圖片、視頻、壓縮包、可執行文件、數據庫備份、Office 文檔、PDF... | **默認、必須、永遠用 binary**,除非確確實實是純文本且需換行符轉換 |
ascii | 純文本文件:.txt, .csv, .log, .sql, .php, .js, .css, .html, .xml (需 CRLF ↔ LF 轉換) | 二進制文件用 ascii 會損壞內容 (字節插入/刪除) |
type | 查看/設置當前傳輸類型 | type (顯示), type binary, type ascii |
文件/目錄操作命令
| 命令 | 縮寫 | 說明 | 示例 |
ls | | 簡略列表 (僅文件名) | ls /remote/path |
dir | | 詳細列表 (權限、大小、時間、擁有者) | dir /remote/path |
cd | | 切換遠程目錄 | cd /var/www/html |
cdup | | 返回上級目錄 (等同 cd ..) | cdup |
pwd | | 顯示遠程當前目錄 | pwd |
mkdir | | 創建遠程目錄 | mkdir backups |
rmdir | | 刪除空遠程目錄 | rmdir old_backups |
delete | | 刪除遠程文件 | delete test.zip |
mdelete | | 批量刪除遠程文件 (支持通配符) | mdelete *.log |
rename | | 重命名/移動遠程文件 | rename old.sql new.sql |
文件傳輸命令 (核心)
| 命令 | 方向 | 說明 | 示例 |
get / recv | 遠程 → 本地 | 下載單文件 | get backup.sql.gz /local/backups/ |
mget | 遠程 → 本地 | 批量下載 (通配符),逐個確認 (prompt on) | mget *.sql.gz |
put / send | 本地 → 遠程 | 上傳單文件 | put /local/app.zip /remote/releases/ |
mput | 本地 → 遠程 | 批量上傳 (通配符) | mput *.zip |
append | 本地 → 遠程 | 追加本地文件到遠程文件末尾 (斷點續傳核心) | append huge.iso /remote/huge.iso |
進階/輔助命令
| 命令 | 說明 | 示例 |
prompt | 切換交互確認 (mget/mput 時逐個詢問)。prompt off 批量無需確認 | prompt off |
glob | 切換通配符展開 (默認 on)。glob off 禁用 * ? | glob off |
hash | 切換傳輸進度 # 打印 (每 2KB 一個 #)。視覺化進度 | hash on |
bell | 切換傳輸完成響鈴 | bell on |
debug | 切換調試輸出 (顯示發送給服務器的原始命令)。排查協議問題 | debug on |
trace | 切換數據包路由跟蹤 (極少用) | trace on |
status | 顯示當前連接狀態、傳輸模式、提示狀態等 | status |
quote / literal | 發送原始 FTP 命令給服務器 (繞過客戶端封裝)。用於非標準擴展命令 | quote SITE CHMOD 755 file.php |
remotehelp | 顯示服務器支持的命令列表 (需服務器支持 HELP 命令) | remotehelp |
site | 發送 SITE 特定命令 (如 CHMOD, UMASK, IDLE, EXEC) | site chmod 644 index.php |
自動化腳本模板 (Shell + FTP 批處理)
# /usr/local/bin/ftp_backup.sh
#!/bin/bash
HOST="ftp.backup.com"
USER="backup_user"
PASS="StrongPassword123"
REMOTE_DIR="/backups/$(date +%Y%m)"
LOCAL_FILE="/data/backup_$(date +%F).sql.gz"
# 創建遠程目錄 (忽略已存在錯誤)
ftp -inv $HOST <
加入 crontab:0 2 * * * /usr/local/bin/ftp_backup.sh (每天凌晨 2 點備份上傳)
被動模式 vs 主動模式 — 連不上的 90% 原因
| 模式 | 數據連接發起方 | 防火牆/NAT 穿透難度 | 客戶端設置 |
| 主動 | 服務器主動連接客戶端端口 | 極難 (客戶端通常在 NAT/防火牆後) | 客戶端需開放高端口、配置端口映射 |
| 被動 (PASV) | 客戶端連接服務器高端口 | **易** (只需服務器防火牆開放被動端口範圍) | **默認、強制使用** passive on / ftp -p |
服務器端配置 (vsftpd 示例):
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
pasv_address=你的公網IP (若服務器在 NAT 後)
防火牆放行:21 (命令) + 40000-40100 (被動數據)
安全加固清單
- 禁用匿名登錄:
anonymous_enable=NO
- 限制用戶目錄:
chroot_local_user=YES (限制在家目錄)
- 啟用 SSL/TLS (FTPS):
ssl_enable=YES, 強制加密控制/數據連接
- 限制並發連接/速率:
max_clients=50, max_per_ip=5, local_max_rate=10M
- 日誌審計:
xferlog_enable=YES, log_ftp_protocol=YES
- 定期輪換密鑰/密碼,禁用弱密碼
總結
FTP 命令集不大,但**「Binary 模式、被動模式、批量腳本、FTPS 加密、chroot 限制」**這五大實戰鐵律決定了能否在生產環境穩定、安全地跑起來。把這份速查表存入 ~/cheatsheets/ftp.md,下次傳文件、寫腳本、排查連不上時,翻一眼就夠了——不用再去搜「ftp 怎麼下載整個目錄」。