Sauvegarde rapide et fiable des données dans le cloud 2

Dans mon article précédent , j'ai décrit un exemple de script qui peut archiver et télécharger une certaine quantité de fichiers utilisateur dans le cloud sans sa participation, fournissant ainsi la sauvegarde la plus simple des fichiers utilisateur. Le script fournit la fermeture des problèmes suivants:

  • rapide (parfait en arrière-plan);
  • Il conserverait à la fois la version actuelle des fichiers et les précédents;
  • le stockage des fichiers ne serait pas accessible aux virus ou aux catastrophes naturelles telles que la destruction du transporteur ou son vol;
  • le contenu de la copie de sauvegarde ne serait accessible qu'à l'utilisateur, c'est-à-dire était protégé par mot de passe.

Naturellement, la simplicité du script s'est transformée en ses défauts, à savoir:

  • Stockage des mots de passe dans le corps du script. Oui, de nombreux programmes stockent les mots de passe non chiffrés dans des fichiers texte, et la protection de ces données se fait par le contrôle d'accès aux fichiers, mais toujours extraire le mot de passe du code est un signe de bon goût et de protection minimale au cas où le script de travail tomberait entre de mauvaises mains d'une manière ou d'une autre. .
  • Absence de vérification de la réussite de l'opération et retour à l'état précédent si l'opération ne s'est pas terminée avec succès.
  • Absence de journalisation et de notification à l'utilisateur du succès de l'opération si le script est exécuté via le planificateur de tâches.

À cet égard, le code de script pour l'archive complète et incrémentielle a été complété par les fonctionnalités nécessaires. Pour une description générale, voir l' article précédent , ici je veux m'attarder uniquement sur les changements.

Script pour créer une archive complète


@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 pour créer une archive incrémentielle


 @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 

Nouvelles équipes:


call pass.bat xx x - appelle un programme externe qui renvoie la variable xx avec la valeur spécifiée pour l'identificateur x.

En conséquence, la variable utilisateur se voit attribuer une valeur associée à l'identifiant 1 (nom d'utilisateur du compte yandex), pass - 2 (mot de passe du compte yandex), pwd - 3 (mot de passe pour l'archive), destinataire - 4 (mail, où envoyer le journal des opérations).

Le script pass.bat est donné sous condition, la méthode de protection par mot de passe peut être choisie différemment, mais pour ceux-ci, cette option convient également, je donne le code le plus simple pour ce script:

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

Lorsqu'il est appelé, ce code localise le fichier pass.txt à côté de lui et attribue à la variable dont le nom est spécifié dans le premier argument du script appeler la valeur de cette ligne du fichier pass.txt dont le numéro est indiqué dans le deuxième argument de l'appel de script. L'emplacement des fichiers pass.bat et pass.txt n'est pas critique, tant qu'ils se trouvent dans le même répertoire que celui spécifié dans le chemin des variables système.

set mailsend = mailsend1.17b15.exe - indique le programme d'envoi d'un rapport au courrier de l'utilisateur. La lettre est envoyée depuis le compte yandex.ru, à partir duquel les fichiers sont envoyés vers le cloud.

set i = 1 - place le compteur de tentatives à 1

call: loging "-----------------------------------" - appelez la procédure de journalisation. Une ligne est transmise à la procédure, qui est ensuite écrite dans 2 fichiers - le fichier journal % filebkp% -log.txt et un fichier séparé des opérations en cours % filebkp% -log.tmp , qui est ensuite envoyé à l'utilisateur sous forme de rapport sur le résultat de l'archivage.

En conséquence, les lignes de journalisation dans le corps des scripts montrent simultanément à l'utilisateur les opérations effectuées pendant l'opération, les écrivent dans les journaux et pour moi, ce sont des commentaires dans le corps du script expliquant ce qui est fait sur les lignes suivantes.

Par conséquent, le script de copie complète et le script de copie incrémentielle effectuent les opérations suivantes:

  1. pour une archive complète - crée des copies de sauvegarde des archives actuelles sur le serveur et sur l'ordinateur local
  2. crée une nouvelle sauvegarde
  3. essayer de l'envoyer au serveur
  4. après l'envoi, téléchargez une copie de sauvegarde et comparez avec l'original
  5. si la comparaison réussit, il envoie un journal des opérations au serveur et l'utilisateur reçoit un rapport sur l'opération réussie via mailsend1.17b15.exe + pour l'archive complète, supprime les versions obsolètes de l'archive
  6. s'il y a une différence entre les fichiers, il essaie d'envoyer à nouveau le fichier au serveur et s'il ne parvient pas à envoyer dans les 5 tentatives, il envoie le journal des opérations au serveur et l'utilisateur signale l'échec via mailsend1.17b15.exe:
  7. nettoie un fichier temporaire des opérations en cours.

PS


Ces scripts ne sont donnés qu'à titre d'exemples, il n'y a aucune envie de réécrire sous PowerShell, car Il est important pour moi que cela fonctionne sur n'importe quel système, y compris Windows XP. Il n'y a pas de protection contre le vol de mot de passe, ce que les experts en sécurité offriraient serait intéressant, mais la séparation du code et des mots de passe avec la possibilité de placer les mots de passe dans un autre répertoire élimine au moins la possibilité d'une erreur stupide qu'en envoyant un script à un ami, il obtiendra également des mots de passe.

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


All Articles