Backup de dados rápido e confiável na nuvem 2

No artigo anterior , descrevi um exemplo de script que pode arquivar e fazer upload de uma certa quantidade de arquivos do usuário na nuvem sem sua participação, fornecendo, assim, o backup mais simples dos arquivos do usuário. O script fornece o fechamento dos seguintes problemas:

  • rápido (perfeito em segundo plano);
  • Manteria a versão atual dos arquivos e as anteriores;
  • o armazenamento de arquivos não seria acessível a vírus ou desastres naturais, como a destruição da mídia ou seu roubo;
  • o conteúdo da cópia de backup seria acessível apenas ao usuário, ou seja, foi protegido por senha.

Naturalmente, a simplicidade do script se transformou em suas deficiências, a saber:

  • Armazenando senhas no corpo do script. Sim, muitos programas armazenam senhas não criptografadas em arquivos de texto, e a proteção desses dados ocorre através do controle de acesso aos arquivos, mas ainda assim extrair a senha do código é um sinal de bom gosto e proteção mínima, caso o script de trabalho fique nas mãos erradas. .
  • Falta de verificação da conclusão bem-sucedida da operação e reversão para o estado anterior se a operação não foi concluída com êxito.
  • Falta de registro e notificação do usuário sobre o sucesso da operação se o script for executado através do planejador de tarefas.

Nesse sentido, o código de script para o arquivo completo e incremental foi complementado com a funcionalidade necessária. Para uma descrição geral, consulte o artigo anterior , aqui quero me concentrar apenas nas alterações.

Script para criar um arquivo completo


@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 

Script para criar um arquivo incremental


 @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 

Novas equipes:


chamar pass.bat xx x - chama um programa externo que retorna a variável xx com o valor especificado para o identificador x.

Por conseguinte, é atribuído à variável de usuário um valor associado ao identificador 1 (nome de usuário da conta yandex), passe - 2 (senha da conta yandex), pwd - 3 (senha do arquivo), destinatário - 4 (correio, para onde enviar o log da operação).

O script pass.bat é fornecido condicionalmente, o método de proteção por senha pode ser escolhido de forma diferente, mas para aqueles que essa opção também é adequada, dou o código mais simples para esse script:

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

Quando chamado, esse código localiza o arquivo pass.txt próximo a ele e atribui à variável cujo nome é especificado no primeiro argumento do script, chame o valor dessa linha do arquivo pass.txt cujo número é indicado no segundo argumento da chamada de script. O local dos arquivos pass.bat e pass.txt não é crítico, desde que estejam no mesmo diretório especificado no caminho da variável do sistema.

set mailsend = mailsend1.17b15.exe - indica o programa para enviar um relatório ao correio do usuário. A carta é enviada da conta yandex.ru, da qual os arquivos são enviados para a nuvem.

defina i = 1 - defina o contador de tentativas para 1

call: loging "-----------------------------------" - chame o procedimento de log. Uma linha é passada para o procedimento, que é gravado em 2 arquivos - o arquivo de log % filebkp% -log.txt e um arquivo separado das operações atuais % filebkp% -log.tmp , que é enviado ao usuário como um relatório sobre o resultado do arquivamento.

Assim, as linhas de log no corpo dos scripts mostram ao usuário simultaneamente as operações executadas durante a operação, gravam-nas nos logs e, para mim, são comentários no corpo do script, explicando o que é feito nas linhas a seguir.

Assim, o script de cópia completa e o script de cópia incremental executam as seguintes operações:

  1. para um arquivo completo - cria cópias de backup dos arquivos atuais no servidor e no computador local
  2. cria um novo backup
  3. tentando enviá-lo para o servidor
  4. após o envio, faça o download de uma cópia de backup e compare com a original
  5. se a comparação for bem-sucedida, ele envia um log de operações para o servidor e o usuário recebe um relatório sobre a operação bem-sucedida via mailsend1.17b15.exe + para o arquivo completo, exclui versões desatualizadas do arquivo
  6. se houver uma diferença entre os arquivos, ele tenta enviar o arquivo novamente para o servidor e, se não enviar em 5 tentativas, envia o log de operações para o servidor e o usuário relata a falha via mailsend1.17b15.exe:
  7. limpa um arquivo temporário das operações atuais.

PS


Esses scripts são fornecidos apenas como exemplos, não há desejo de reescrever no PowerShell, porque É importante para mim que funcione em qualquer sistema, incluindo o Windows XP. Não há proteção contra roubo de senhas, seria interessante o que os especialistas em segurança ofereceriam, mas a separação de código e senhas com a capacidade de colocar senhas em outro diretório pelo menos elimina a possibilidade de um erro estúpido de que, ao enviar um script para um amigo, ele também receberá senhas.

Source: https://habr.com/ru/post/pt437794/


All Articles