本文目录导读:

- 基础FTP脚本(Windows批处理)
- Shell脚本(Linux/Mac)
- 使用lftp(更强大的工具,需要安装)
- Python脚本(跨平台)
- PowerShell脚本(Windows)
- 带日志和错误处理的增强版Shell脚本
- 使用建议
基础FTP脚本(Windows批处理)
@echo off REM FTP上传脚本 - Windows set FTP_HOST=ftp.example.com set FTP_USER=username set FTP_PASS=password set LOCAL_DIR=C:\local\folder\ set REMOTE_DIR=/remote/folder/ echo user %FTP_USER%> ftp_commands.txt echo %FTP_PASS%>> ftp_commands.txt echo cd %REMOTE_DIR%>> ftp_commands.txt echo binary>> ftp_commands.txt echo lcd %LOCAL_DIR%>> ftp_commands.txt echo mput *.*>> ftp_commands.txt echo quit>> ftp_commands.txt ftp -s:ftp_commands.txt %FTP_HOST% del ftp_commands.txt
Shell脚本(Linux/Mac)
#!/bin/bash # FTP下载脚本 HOST="ftp.example.com" USER="username" PASS="password" REMOTE_DIR="/remote/path/" LOCAL_DIR="/local/path/" FILE="important_file.txt" ftp -n $HOST << EOF quote USER $USER quote PASS $PASS lcd $LOCAL_DIR cd $REMOTE_DIR binary get $FILE quit EOF
使用lftp(更强大的工具,需要安装)
#!/bin/bash # 使用lftp的高级脚本 HOST="ftp.example.com" USER="username" PASS="password" lftp -u $USER,$PASS $HOST << EOF mirror --verbose --parallel=3 \ /remote/source/ /local/destination/ quit EOF
Python脚本(跨平台)
#!/usr/bin/env python3
# ftp_upload.py
from ftplib import FTP
import os
def upload_file(host, user, passwd, local_file, remote_dir):
with FTP(host) as ftp:
ftp.login(user, passwd)
ftp.cwd(remote_dir)
with open(local_file, 'rb') as f:
ftp.storbinary(f'STOR {os.path.basename(local_file)}', f)
def download_file(host, user, passwd, remote_file, local_dir):
with FTP(host) as ftp:
ftp.login(user, passwd)
local_path = os.path.join(local_dir, os.path.basename(remote_file))
with open(local_path, 'wb') as f:
ftp.retrbinary(f'RETR {remote_file}', f.write)
# 使用示例
upload_file('ftp.example.com', 'user', 'pass', 'test.txt', '/upload/')
download_file('ftp.example.com', 'user', 'pass', '/download/report.csv', './')
PowerShell脚本(Windows)
# FTP上传脚本 - PowerShell
$ftpServer = "ftp.example.com"
$ftpUser = "username"
$ftpPass = "password"
$localFile = "C:\files\data.txt"
$remoteFile = "/upload/data.txt"
$ftp = [System.Net.FtpWebRequest]::Create("ftp://$ftpServer$remoteFile")
$ftp.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPass)
$ftp.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$fileContent = [System.IO.File]::ReadAllBytes($localFile)
$ftp.ContentLength = $fileContent.Length
$requestStream = $ftp.GetRequestStream()
$requestStream.Write($fileContent, 0, $fileContent.Length)
$requestStream.Close()
$response = $ftp.GetResponse()
Write-Host "Upload completed: $($response.StatusDescription)"
带日志和错误处理的增强版Shell脚本
#!/bin/bash
# 带日志的FTP同步脚本
LOG_FILE="/var/log/ftp_sync.log"
HOST="ftp.example.com"
USER="username"
PASS="password"
REMOTE_DIR="/backups/"
LOCAL_DIR="/data/backups/"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 检查网络连接
if ! ping -c 1 $HOST &> /dev/null; then
log "ERROR: Cannot reach FTP server $HOST"
exit 1
fi
# 开始同步
log "Starting FTP sync from $LOCAL_DIR to $HOST:$REMOTE_DIR"
cd $LOCAL_DIR
ftp -n $HOST << EOF &>> $LOG_FILE
quote USER $USER
quote PASS $PASS
cd $REMOTE_DIR
binary
prompt off
mput *
quit
EOF
if [ $? -eq 0 ]; then
log "Sync completed successfully"
else
log "ERROR: Sync failed with exit code $?"
exit 1
fi
使用建议
-
安全性:避免在脚本中硬编码密码,可考虑使用:
- 环境变量
- 加密的配置文件
- .netrc文件
-
错误处理:生产环境脚本应包含完善的错误处理和日志记录
-
批量处理:使用
mget/mput或mirror命令处理多个文件 -
连接测试:先测试连接是否可用再开始传输
-
定时任务:结合cron(Linux)或任务计划程序(Windows)实现自动化
选择哪种脚本取决于你的操作系统环境、具体需求和可用的工具,Python脚本提供了最好的跨平台兼容性,而lftp则提供了最强大的功能集。