ftp 是經典的文件傳輸協議客戶端,雖然安全性備受詬病(明文傳輸用戶名/密碼/數據),但在舊系統維護、網絡設備固件升級、隔離環境數據交換、腳本兼容性測試等場景仍不可或缺。本文系統整理 ftp 交互命令、自動化腳本模式、安全最佳實踐與現代替代方案遷移路徑。
# 安裝 (RHEL/CentOS)
yum install -y ftp
# Debian/Ubuntu
apt-get install -y ftp
# 連接
ftp 192.168.1.100
# 或進入 ftp 提示符後
ftp> open 192.168.1.100 21
| 命令 | 功能 | 關鍵參數/說明 |
|---|---|---|
open host [port] | 連接 FTP 服務器 | |
user username [password] [account] | 指定登錄憑證 | 密碼可省略交互輸入 |
login | 重新登錄 | |
close / disconnect / bye / quit | 斷開連接並退出 | |
pwd | 顯示遠程工作目錄 | |
cd directory | 切換遠程目錄 | |
cdup | 切換到遠程父目錄 | |
lcd [directory] | 切換本地工作目錄 | 無參數顯示當前本地目錄 |
ls [remote-dir] [local-file] | 顯示遠程目錄簡短列表 | 可重定向輸出到本地文件 |
dir [remote-dir] [local-file] | 顯示遠程目錄詳細列表 | 類似 ls -l |
mls remote-files local-file | 多文件簡短列表寫入本地文件 | |
mdir remote-files local-file | 多文件詳細列表寫入本地文件 | |
ascii | 設置 ASCII 傳輸模式 | 文本文件、跨平台換行轉換 |
binary / image / bin | 設置二進制傳輸模式 | **預設、所有非文本文件必用** |
type [ascii|binary] | 查看/設置傳輸類型 | |
get remote-file [local-file] | 下載單個文件 | |
mget remote-files | 下載多個文件 | 支援通配符,配合 prompt off 批量 |
put local-file [remote-file] | 上傳單個文件 | |
mput local-files | 上傳多個文件 | 支援通配符,配合 prompt off 批量 |
append local-file [remote-file] | 追加本地文件到遠程文件 | |
delete remote-file | 刪除遠程單個文件 | |
mdelete remote-files | 刪除遠程多個文件 | |
mkdir directory | 創建遠程目錄 | |
rmdir directory | 刪除遠程空目錄 | |
rename from to | 重命名遠程文件 | |
chmod mode file | 修改遠程文件權限 | 需服務器支援 SITE CHMOD |
passive / passive on|off | 啟用/禁用被動模式 (PASV) | **防火牆/NAT 環境必開** |
prompt | 切換交互提示 (mget/mput 確認) | 批量操作前 prompt off |
hash | 切換 # 進度顯示 (每 1024/8192 字節) | |
tick | 切換字節計數器顯示 | |
status | 顯示當前狀態 (模式、結構、詳細) | |
verbose | 切換詳細輸出模式 | |
debug | 切換調試輸出 (顯示協議交互) | |
bell | 切換傳輸完成響鈴 | |
quote / literal command | 發送原始 FTP 命令 | 支援服務器特定擴展命令 |
site command | 發送 SITE 特定命令 | 如 site chmod 644 file |
system | 顯示遠程系統類型 | |
help [command] | 顯示幫助 | |
! [command] | 執行本地 Shell 命令 / 進入 Shell | !ls, ! 進入 Shell, exit 返回 ftp |
#!/bin/bash
HOST="192.168.1.100"
USER="backup_user"
PASS="secure_password"
REMOTE_DIR="/backup/daily"
LOCAL_DIR="/data/backup"
ftp -n -v $HOST << EOF
user $USER $PASS
binary
prompt off
cd $REMOTE_DIR
lcd $LOCAL_DIR
mput *.tar.gz
mget *.log
bye
EOF
關鍵參數:
-n禁用自動登錄(配合user命令),-v顯示詳細進度,-i禁用交互提示 (等同腳本中prompt off)。
#!/usr/bin/expect
set timeout 30
set host "192.168.1.100"
set user "backup_user"
set pass "secure_password"
spawn ftp -n $host
expect "Name*"
send "user $user $pass\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "prompt off\r"
expect "ftp>"
send "cd /backup/daily\r"
expect "ftp>"
send "lcd /data/backup\r"
expect "ftp>"
send "mput *.tar.gz\r"
expect "ftp>"
send "bye\r"
expect eof
# 安裝
yum install -y lftp # 或 apt-get install lftp
# 單行命令模式
lftp -u user,pass -e "set ftp:passive-mode on; mirror -R /local/dir /remote/dir; quit" ftp://192.168.1.100
# 腳本文件
cat > sync.lftp << 'EOF'
open -u user,pass ftp://192.168.1.100
set ftp:passive-mode on
set net:timeout 30
set net:max-retries 3
mirror -R --delete --verbose /local/data /remote/backup
# -R 反向鏡像(上傳) --delete 刪除遠程多餘文件
quit
EOF
lftp -f sync.lftp
lftp 優勢:支援斷點續傳、並行傳輸 (`pget`/`mget -c`)、鏡像同步 (`mirror`)、SFTP/FTPS/HTTP、腳本化更強、Tab 補全、別名、作業控制。
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50100
pasv_address=公網IP (NAT環境)
防火牆僅開放 21 (命令) + 50000-50100 (數據)。
# vsftpd
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
客戶端需支援 FTPS(lftp、FileZilla、WinSCP 均支援,標準 ftp 不支援)。| 現象 | 原因 | 解決 |
|---|---|---|
| 連接成功但 ls/dir/get 掛起/超時 | 主動模式下數據連接被防火牆/NAT 阻擋 | 啟用被動模式:passive 或 ftp -p (啟動時) 或 lftp set ftp:passive-mode on |
| 530 Login incorrect | 用戶名/密碼錯、用戶被禁用、shell 為 /sbin/nologin 但未加 /etc/shells | 檢查憑證、chage -l user、getent passwd user |
| 550 Permission denied | 文件系統權限、SELinux/AppArmor、vsftpd 配置 write_enable=NO | 檢查目錄權限、SELinux 上下文 restorecon -R、vsftpd 配置 |
| 425 Can't open data connection | 被動模式埠範圍未開放、防火牆狀態檢測失敗 | 防火牆開放被動埠、ip_conntrack_ftp 模組載入 |
| 傳輸極慢/中斷 | MTU 不匹配、TCP 窗口縮放、磁碟 I/O 瓶頸 | 調整 MTU、啟用 TCP BBR、檢查磁碟 |
| 文件名亂碼 | 編碼不一致 (服務器 UTF-8, 客戶端 GBK 或相反) | lftp: set ftp:charset "utf-8"; 標準 ftp 無良方案 |
| 協議/工具 | 安全性 | 效能 | 功能 | 遷移難度 | 推薦場景 |
|---|---|---|---|---|---|
| SFTP (SSH File Transfer) | ✅ 加密、認證、完整性 | 良好 (CPU 開銷) | 完整文件操作、權限、斷點續傳 | 低 (OpenSSH 內建) | **首選替代**,所有 Linux/Unix 互傳 |
| rsync over SSH | ✅ 加密 | ✅ 增量、壓縮、並行、校驗 | 同步、鏡像、備份、部署 | 低 | **數據同步/備份/發布首選** |
| SCP | ✅ 加密 | 一般 (單流) | 簡單複製 | 極低 | 臨時單文件傳輸 |
| HTTPS/REST API | ✅ TLS、Token/OAuth | 良好 (多路復用) | 應用層語義、Webhook、元數據 | 中 (需應用支援) | 微服務、對象存儲、雲原生 |
| FTPS (FTP over TLS) | ✅ 加密 | 同 FTP | 同 FTP | 中 (需服務器/客戶端雙支援) | 無法遷移 SSH 的舊設備/主機 |

ftp 承載了互聯網早期文件傳輸的記憶,但其明文本質在現代網絡環境中已不可接受。**新建系統務必選擇 SFTP/rsync/HTTPS**;存量 FTP 系統實施「FTTS 強制、被動模式鎖定、埠範圍收斂、審計日誌、網絡隔離」五大安全基線,並制定明確遷移時間表。運維腳本庫全面替換為 lftp/rsync/scp,徹底杜絕明文傳輸風險。