Shell 腳本中使用 Here Document (<<) 饋送 FTP 子命令,實現非交互式自動化上傳/下載/目錄操作。
核心模板
#!/bin/bash
HOST="172.1.1.1"
USER="username"
PASS="password"
REMOTE_DIR="/list"
LOCAL_FILE="/local/path/filename"
REMOTE_NAME="newfilename"
ftp -n -i "$HOST" << FTP_EOF
user $USER $PASS
cd $REMOTE_DIR
prompt off
binary
put "$LOCAL_FILE" "$REMOTE_NAME"
bye
FTP_EOF
參數解析
| 參數 | 含義 |
-n | 禁用自動登錄 (.netrc),由腳本手動發送 user 命令 |
-i | 關閉交互式提示 (mput/mget 確認) |
prompt off | FTP 內部關閉多文件傳輸確認提示 |
binary | 二進制傳輸模式 (保證圖片/壓縮包不損壞),對應 ascii 文本模式 |
put local remote | 上傳單文件 |
get remote local | 下載單文件 |
mput *.log | 批量上傳 (配合 prompt off) |
lcd /local/dir | 切換本地工作目錄 |
進階:錯誤處理與日志記錄
#!/bin/bash
LOG_FILE="/var/log/ftp_upload_$(date +%F).log"
exec >> "$LOG_FILE" 2>&1
echo "=== $(date) 開始 FTP 上傳 ==="
if ftp -n -i "$HOST" << FTP_EOF 2>&1; then
user $USER $PASS
cd $REMOTE_DIR
binary
put "$LOCAL_FILE" "$REMOTE_NAME"
bye
FTP_EOF
then
echo "✅ 上傳成功"
else
echo "❌ 上傳失敗,退出碼: $?"
# 發送告警
curl -X POST -d "text=FTP上傳失敗: $HOST $LOCAL_FILE" "$ALERT_WEBHOOK"
fi
echo "=== $(date) 結束 ==="
現代化替代:SFTP/SCP + SSH Key (更安全、無明文密碼)
# 1. 生成密鑰對 (免密登錄)
ssh-keygen -t ed25519
ssh-copy-id user@host
# 2. SCP 單文件
scp /local/file user@host:/remote/path/
# 3. SFTP 批量 (Here Document 同理)
sftp -b - user@host << SFTP_EOF
cd /remote/dir
put /local/file
bye
SFTP_EOF
# 4. rsync 增量同步 (生產首選)
rsync -avz --progress /local/dir/ user@host:/remote/dir/
核心優勢:加密傳輸、密鑰認證、斷點續傳、帶寬限制、完整性校驗。
- 上一篇文章: MySQL 4.1+ 漢字亂碼根因與 UTF-8 全鏈路遷移實戰:從 latin1 到 utf8mb4
- 下一篇文章: MySQL 數據檢索全攻略:從 SELECT 基礎到條件查詢、排序、聚合實戰
Copyright ©
程式碼之家 All Rights Reserved