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