快速可靠的数据备份到云2

在我的上一篇文章中,我描述了一个示例脚本,该脚本可以在不参与的情况下将一定数量的用户文件存档和上传到云中,从而提供最简单的用户文件备份。 该脚本关闭了以下问题:

  • 快速(在后台完美);
  • 它将保留文件的当前版本和先前版本;
  • 文件存储将无法访问病毒或自然灾害,例如介质毁坏或被盗;
  • 备份副本的内容只能由用户访问,即 受密码保护。

自然,脚本的简单性变成了它的缺点,即:

  • 在脚本主体中存储密码。 是的,许多程序将未加密的密码存储在文本文件中,并且通过对文件的访问控制来保护此数据,但是仍然可以从代码中提取密码,这是一种好习惯的迹象,并且在工作脚本以某种方式落入错误之手的情况下提供了最低限度的保护。 。
  • 缺少对操作成功完成的验证,如果操作没有成功完成,则回滚到以前的状态。
  • 如果脚本是通过任务计划程序运行的,则缺少日志记录和用户有关操作成功的通知。

在这方面,完整存档文件和增量存档的脚本代码补充了必要的功能。 有关一般说明,请参见前面的文章 ,在这里我只想介绍更改。

创建完整档案的脚本


@echo off chcp 1251 >nul set filebkp=server call pass.bat user 1 call pass.bat pass 2 call pass.bat pwd 3 call pass.bat recipient 4 set mailsend=mailsend1.17b15.exe set i=1 set pathbkp=..\backup set pathtemp=..\temp set srvbkp=https://%user%:%pass%@webdav.yandex.ru/backup/%filebkp% set full=%filebkp%-full set inc=%filebkp%-inc set h=%TIME:~0,2% set m=%TIME:~3,2% set s=%TIME:~6,2% set ms=%TIME:~9,2% set curtime=%h%-%m%-%s% set dd=%DATE:~0,2% set mm=%DATE:~3,2% set yyyy=%DATE:~6,4% set curdate=%yyyy%-%mm%-%dd% set curdatetime=%curdate: =0%-%curtime: =0% call :loging "-----------------------------------" call :loging "  - %curdatetime%" call :loging "    " ren "%pathtemp%" temp-bkp md "%pathtemp%" call :loging "   %full%.7z" 7z.exe a -xr0!*.log -xr0!*.bak -xr0!*.tmp "%pathtemp%\%full%".7z -r -mx1 "%pathbkp%\*" -%pwd% call :loging "      " curl.exe -k -X MOVE -H "Destination:/backup/%filebkp%"-bkp "%srvbkp%" -o .\stdout curl.exe -k -X MKCOL "%srvbkp%" -o .\stdout :upload call :loging "   %i%" call :loging "    %full%.7z" curl.exe -k -T "%pathtemp%\%full%".7z "%srvbkp%"/ --progress-bar -o .\stdout call :loging "  %full%.7z      " curl.exe -k "%srvbkp%/%full%".7z -o "%pathtemp%"\test.7z --progress-bar -o .\stdout call :loging "    " fc /LB1 /B "%pathtemp%\%full%".7z "%pathtemp%"\test.7z > nul if ERRORLEVEL 1 goto Different call :loging " :" set tolog="%full%.7z    " call :loging %tolog% set mailsubject=%tolog:"=% call :loging "       " RD /s/q "%pathtemp%"-bkp curl.exe -k -X DELETE "%srvbkp%"-bkp -o .\stdout del /q "%pathtemp%"\test.7z goto exit :Different call :loging " : %full%.7z      " call :loging " " set /a i+=1 if %i% = 5 goto exit-f goto upload :exit-f set tolog="  %full%.7z    " call :loging %tolog% set mailsubject=%tolog:"=% call :loging "   " RD /s/q "%pathtemp%" ren "%pathtemp%"-bkp temp curl.exe -k -X DELETE "%srvbkp%" -o .\stdout curl.exe -k -X MOVE -H "Destination:/backup/%filebkp%" "%srvbkp%"-bkp -o .\stdout :exit echo   %filebkp%-log.txt   curl.exe -k -T %filebkp%-log.txt "%srvbkp%"/../ --progress-bar -o .\stdout echo     %mailsend% -to %recipient% -from %user%@yandex.ru -ssl -port 465 -auth -smtp smtp.yandex.ru -user %user% -pass %pass% -sub "%filebkp%: %curdatetime% - %mailsubject%" -cs "windows-1251" -mime-type "text/plain" -msg-body %filebkp%-log.tmp del /q %filebkp%-log.tmp exit :loging echo %~1 echo %~1 >> %filebkp%-log.txt echo %~1 >> %filebkp%-log.tmp exit /b 

创建增量存档的脚本


 @echo off chcp 1251 >nul set filebkp=server call pass.bat user 1 call pass.bat pass 2 call pass.bat pwd 3 call pass.bat recipient 4 set mailsend=mailsend1.17b15.exe set tolog=zero set mailsubject=zero set i=1 set pathbkp=..\backup set pathtemp=..\temp set srvbkp=https://%user%:%pass%@webdav.yandex.ru/backup/%filebkp% set full=%filebkp%-full set inc=%filebkp%-inc set h=%TIME:~0,2% set m=%TIME:~3,2% set s=%TIME:~6,2% set ms=%TIME:~9,2% set curtime=%h%-%m%-%s% set dd=%DATE:~0,2% set mm=%DATE:~3,2% set yyyy=%DATE:~6,4% set curdate=%yyyy%-%mm%-%dd% set curdatetime=%curdate: =0%-%curtime: =0% call :loging "-----------------------------------" call :loging "  - %curdatetime%" call :loging "   %inc%-%curdatetime%.7z" 7z.exe u -xr0!*.log -xr0!*.bak -xr0!*.tmp "%pathtemp%\%full%".7z -u- -up3q3r2x2y2z0w2!"%pathtemp%\%inc%-%curdatetime%".7z "%pathbkp%\*" -%pwd% :upload call :loging "   %i%" call :loging "   " curl.exe -k -T "%pathtemp%\%inc%-%curdatetime%".7z "%srvbkp%"/ --progress-bar -o .\stdout call :loging "       " curl.exe -k "%srvbkp%/%inc%-%curdatetime%".7z -o "%pathtemp%"\test.7z --progress-bar -o .\stdout call :loging "    " fc /LB1 /B "%pathtemp%\%inc%-%curdatetime%".7z "%pathtemp%"\test.7z > nul if ERRORLEVEL 1 goto Different call :loging " " set tolog="%inc%-%curdatetime%.7z    " call :loging %tolog% set mailsubject=%tolog:"=% goto exit :Different call :loging " : %inc%-%curdatetime%.7z      " call :loging " " set /a i+=1 if %i% = 5 goto exit-f goto upload :exit-f set tolog="  %inc%-%curdatetime%.7z    " call :loging %tolog% set mailsubject=%tolog:"=% :exit del /q "%pathtemp%"\test.7z echo   %filebkp%-log.txt   curl.exe -k -T %filebkp%-log.txt "%srvbkp%"/../ --progress-bar -o .\stdout echo     %mailsend% -to %recipient% -from %user%@yandex.ru -ssl -port 465 -auth -smtp smtp.yandex.ru -user %user% -pass %pass% -sub "%filebkp%: %mailsubject%" -cs "windows-1251" -mime-type "text/plain" -msg-body %filebkp%-log.tmp del /q %filebkp%-log.tmp exit :loging echo %~1 echo %~1 >> %filebkp%-log.txt echo %~1 >> %filebkp%-log.tmp exit /b 

新团队:


调用pass.bat xx x-调用一个外部程序,该程序返回变量xx和为标识符x指定的值。

因此,为用户变量分配了一个与标识符1(yandex帐户的用户名),pass-2(yandex帐户的密码),pwd-3(到存档的密码),收件人-4(邮件,将操作日志发送到哪里)相关的值。

pass.bat脚本是有条件地给出的,可以选择不同的密码保护方法,但是对于那些该选项也适用的情况,我给出此脚本的最简单代码:

 for /f "usebackq delims=" %%i in (`find /n /v "" "%~dp0"pass.txt ^| find "[%2]"`) do ( set newvar=%%i ) set %1=%newvar:~3% 

调用它时,此代码将在其旁边找到pass.txt文件,并将其名称指定在脚本调用的第一个参数中的变量分配给pass.txt文件的该行的值,其编号在脚本调用的第二个参数中指示。 pass.bat和pass.txt文件的位置并不重要,只要它们位于系统变量路径中指定的同一目录中即可。

设置mailsend = mailsend1.17b15.exe-指示用于将报告发送到用户邮件的程序。 这封信是从yandex.ru帐户发送的,文件从该帐户发送到云。

设置i = 1-将尝试计数器设置为1

调用:记录“ -----------------------------------” -调用记录过程。 将一行传递到该过程,然后将其写入2个文件-日志文件%filebkp%-log.txt和当前操作的单独文件%filebkp%-log.tmp ,然后将其作为归档结果的报告发送给用户。

因此,脚本主体中的日志记录行同时向用户显示了操作期间执行的操作,将其写入日志,对我而言,脚本主体中的注释解释了以下几行所执行的操作。

因此,完整复制脚本和增量复制脚本执行以下操作:

  1. 完整档案-在服务器和本地计算机上创建当前档案的备份副本
  2. 创建一个新的备份
  3. 尝试将其发送到服务器
  4. 发送后,下载备份副本并与原始副本进行比较
  5. 如果比较成功,它将发送操作日志到服务器,并且用户通过mailsend1.17b15.exe +接收完整归档文件的有关成功操作的报告,删除归档文件的过时版本
  6. 如果文件之间存在差异,它将尝试再次将文件发送到服务器,如果尝试发送5次失败,则将操作日志发送到服务器,并且用户通过mailsend1.17b15.exe报告失败:
  7. 清除当前操作的临时文件。

聚苯乙烯


这些脚本仅作为示例提供,不希望在PowerShell下进行重写,因为 对我而言,它可以在任何系统(包括Windows XP)上运行都很重要。 没有防止密码被盗的保护措施,这对我自己来说很有趣,安全专家会提供什么,但是将代码和密码分离并能够将密码放置在另一个目录中至少可以消除一个愚蠢的错误,即当向朋友发送脚本时,他也会得到密码。

Source: https://habr.com/ru/post/zh-CN437794/


All Articles