Skip to main content

windows下使用内置ftp命令备份文件

使用场景

  1. 异机备份,备份的电脑IP不固定
  2. 出于安全考虑,不想使用scp进行备份,因为这个需要在服务器上创建系统用户,万一备份用户账号密码泄漏会有比较大的风险,使用ftp可以使用虚拟用户,并且将备份目录锁定在指定目录下,就算这个虚拟用户的账号泄漏也不会对整个操作系统造成影响

FTP服务软件

proftpd(推荐,支持虚拟用户,并且配置简单)

vsftpd(支持虚拟用户,但配置有点复杂)

备份脚本

@echo off
chcp 65001

setlocal

:: FTP 服务器信息
set FTP_SERVER=[IP地址] <端口号>
set FTP_USER=backup
set FTP_PASS=******
set FTP_DIR=/backup/
set FTP_FILE=data.backup.gz
set BACK_FILE=%FTP_FILE%.bak
set LOCAL_DIR=%~dp0
set LOG_FILE=%LOCAL_DIR%\backup.log
set CMD_FILE=%LOCAL_DIR%\ftp_commands.txt

:: 切换到当前目录
cd /d %LOCAL_DIR%

:: 备份现有文件
if exist "%LOCAL_DIR%\%FTP_FILE%" (
    echo [%DATE:/=-% %TIME::=:%] - 备份文件 %FTP_FILE% 到 %BACK_FILE% >> %LOG_FILE%
    copy /Y "%LOCAL_DIR%\%FTP_FILE%" "%BACK_FILE%"
) else (
    echo [%DATE:/=-% %TIME::=:%] - 首次备份 >> %LOG_FILE%
)

:: 执行 FTP 命令
echo open %FTP_SERVER%>%CMD_FILE%
echo %FTP_USER%>> %CMD_FILE%
echo %FTP_PASS%>> %CMD_FILE%
echo cd %FTP_DIR%>> %CMD_FILE%
echo get %FTP_FILE%>> %CMD_FILE%
echo bye>> %CMD_FILE%

:: 运行 FTP 命令
ftp -s:%CMD_FILE%

:: 删除临时文件
del %CMD_FILE%

:: 检查下载是否成功
if exist "%LOCAL_DIR%\%FTP_FILE%" (
    if exist "%BACK_FILE%" (
        del "%BACK_FILE%"
        echo [%DATE:/=-% %TIME::=:%] - 删除临时文件"%BACK_FILE%" >> %LOG_FILE%
    )
) else (
    if exist "%BACK_FILE%" (
        copy /Y "%BACK_FILE%" "%LOCAL_DIR%\%FTP_FILE%"
        echo [%DATE:/=-% %TIME::=:%] - 下载备份文件失败"%BACK_FILE%",从临时文件恢复 >> %LOG_FILE%
    ) else (
        echo [%DATE:/=-% %TIME::=:%] - 下载备份文件失败"%BACK_FILE%" >> %LOG_FILE%
    )
)

endlocal