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

使用场景 

 

 异机备份，备份的电脑IP不固定 

 出于安全考虑，不想使用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