Copia de seguridad de datos rápida y confiable en la nube 2

En mi artículo anterior , describí un script de ejemplo que puede archivar y cargar una cierta cantidad de archivos de usuario a la nube sin su participación, proporcionando así la copia de seguridad más simple de los archivos de usuario. El script proporciona el cierre de los siguientes problemas:

  • rápido (perfecto en el fondo);
  • Mantendría tanto la versión actual de los archivos como las anteriores;
  • el almacenamiento de archivos no sería accesible para virus o desastres naturales como la destrucción del medio o su robo;
  • el contenido de la copia de respaldo solo sería accesible para el usuario, es decir estaba protegido con contraseña.

Naturalmente, la simplicidad del guión se convirtió en sus defectos, a saber:

  • Almacenar contraseñas en el cuerpo del script. Sí, muchos programas almacenan contraseñas sin cifrar en archivos de texto, y la protección de estos datos se produce a través del control de acceso a los archivos, pero aún así extraer la contraseña del código es una señal de buen gusto y protección mínima en caso de que el script de trabajo caiga en las manos equivocadas de alguna manera. .
  • Falta de verificación de la finalización exitosa de la operación y retroceso al estado anterior si la operación no se completó con éxito.
  • Falta de registro y notificación del usuario sobre el éxito de la operación si el script se ejecuta a través del programador de tareas.

En este sentido, el código del script para el archivo completo e incremental se complementó con la funcionalidad necesaria. Para una descripción general, vea el artículo anterior , aquí solo quiero detenerme en los cambios.

Script para crear un archivo 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 crear un archivo 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 

Nuevos equipos:


call pass.bat xx x: llama a un programa externo que devuelve la variable xx con el valor especificado para el identificador x.

En consecuencia, a la variable de usuario se le asigna un valor asociado con el identificador 1 (nombre de usuario de la cuenta de yandex), pase - 2 (contraseña de la cuenta de yandex), pwd - 3 (contraseña para el archivo), destinatario - 4 (correo, dónde enviar el registro de operaciones).

El script pass.bat se da condicionalmente, el método de protección con contraseña se puede elegir de manera diferente, pero para aquellos que esta opción también es adecuada, les doy el código más simple para este script:

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

Cuando se llama, este código localiza el archivo pass.txt junto a él y asigna a la variable cuyo nombre se especifica en el primer argumento de la secuencia de comandos llamar el valor de esa línea del archivo pass.txt cuyo número se indica en el segundo argumento de la llamada de secuencia de comandos. La ubicación de los archivos pass.bat y pass.txt no es crítica, siempre que se encuentren en el mismo directorio especificado en la ruta de la variable del sistema.

set mailsend = mailsend1.17b15.exe : indica el programa para enviar un informe al correo del usuario. La carta se envía desde la cuenta yandex.ru, desde donde se envían los archivos a la nube.

set i = 1 - establece el contador de intentos en 1

call: loging "-----------------------------------" - llama al procedimiento de registro. Se pasa una línea al procedimiento, que luego se escribe en 2 archivos: el archivo de registro % filebkp% -log.txt y un archivo separado de las operaciones actuales % filebkp% -log.tmp , que luego se envía al usuario como un informe sobre el resultado del archivo.

En consecuencia, las líneas de registro en el cuerpo de los scripts muestran simultáneamente al usuario las operaciones realizadas durante la operación, las escriben en los registros y para mí son comentarios en el cuerpo del script que explican lo que se realiza en las siguientes líneas.

En consecuencia, el script de copia completo y el script de copia incremental realizan las siguientes operaciones:

  1. para un archivo completo: crea copias de seguridad de los archivos actuales en el servidor y en la computadora local
  2. crea una nueva copia de seguridad
  3. tratando de enviarlo al servidor
  4. después de enviar, descargue una copia de seguridad y compárela con el original
  5. Si la comparación es exitosa, envía un registro de operaciones al servidor y el usuario recibe un informe sobre la operación exitosa a través de mailsend1.17b15.exe + para el archivo completo, elimina las versiones obsoletas del archivo
  6. Si hay una diferencia entre los archivos, intenta enviar el archivo nuevamente al servidor, y si no puede enviarlo en 5 intentos, envía el registro de operaciones al servidor y el usuario informa la falla a través de mailsend1.17b15.exe:
  7. limpia un archivo temporal de las operaciones actuales.

PS


Estos scripts se dan solo como ejemplos, no hay ningún deseo de volver a escribir en PowerShell, porque Es importante para mí que funcione en cualquier sistema, incluido Windows XP. No hay protección contra el robo de contraseñas, sería interesante para mí lo que ofrecerían los expertos en seguridad, pero la separación de códigos y contraseñas con la capacidad de colocar contraseñas en otro directorio al menos elimina la posibilidad de un error estúpido que al enviar un script a un amigo, también obtendrá contraseñas.

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


All Articles