Schnelle und zuverlässige Datensicherung in der Cloud 2

In meinem vorherigen Artikel habe ich ein Beispielskript beschrieben, mit dem eine bestimmte Anzahl von Benutzerdateien ohne deren Teilnahme archiviert und in die Cloud hochgeladen werden kann, wodurch die einfachste Sicherung von Benutzerdateien bereitgestellt wird. Das Skript bietet den Abschluss der folgenden Probleme:

  • schnell (perfekt im Hintergrund);
  • Es würde sowohl die aktuelle als auch die vorherige Version der Dateien beibehalten.
  • Die Speicherung von Dateien wäre für Viren oder Naturkatastrophen wie die Zerstörung des Mediums oder dessen Diebstahl nicht zugänglich.
  • Der Inhalt der Sicherungskopie wäre nur für den Benutzer zugänglich, d. h. war passwortgeschützt.

Natürlich wurde die Einfachheit des Skripts zu seinen Mängeln, nämlich:

  • Speichern von Passwörtern im Hauptteil des Skripts. Ja, viele Programme speichern Kennwörter unverschlüsselt in Textdateien, und der Schutz dieser Daten erfolgt durch Zugriffskontrolle auf Dateien. Das Extrahieren des Kennworts aus dem Code ist jedoch ein Zeichen für guten Geschmack und minimalen Schutz, falls das Arbeitsskript irgendwie in die falschen Hände gerät. .
  • Fehlende Überprüfung des erfolgreichen Abschlusses des Vorgangs und Zurücksetzen auf den vorherigen Status, wenn der Vorgang nicht erfolgreich abgeschlossen wurde.
  • Fehlende Protokollierung und Benachrichtigung des Benutzers über den Erfolg des Vorgangs, wenn das Skript über den Taskplaner ausgeführt wird.

In diesem Zusammenhang wurde der Skriptcode für das vollständige und inkrementelle Archiv mit der erforderlichen Funktionalität ergänzt. Eine allgemeine Beschreibung finden Sie im vorhergehenden Artikel . Hier möchte ich nur auf die Änderungen eingehen.

Skript zum Erstellen eines vollständigen Archivs


@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 

Skript zum Erstellen eines inkrementellen Archivs


 @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 

Neue Teams:


call pass.bat xx x - ruft ein externes Programm auf, das die Variable xx mit dem für den Bezeichner x angegebenen Wert zurückgibt.

Dementsprechend wird der Benutzervariable ein Wert zugewiesen, der der Kennung 1 (Benutzername des Yandex-Kontos), Pass-2 (Passwort des Yandex-Kontos), Pwd-3 (Passwort für das Archiv), Empfänger-4 (Mail, wohin das Operationsprotokoll gesendet werden soll) zugeordnet ist.

Das pass.bat-Skript wird bedingt angegeben, die Kennwortschutzmethode kann unterschiedlich gewählt werden, aber für diese ist diese Option auch geeignet, ich gebe den einfachsten Code für dieses Skript:

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

Wenn dieser Code aufgerufen wird, findet er die Datei pass.txt daneben und weist der Variablen, deren Name im ersten Argument des Skriptaufrufs angegeben ist, den Wert dieser Zeile der Datei pass.txt zu, deren Nummer im zweiten Argument des Skriptaufrufs angegeben ist. Der Speicherort der Dateien pass.bat und pass.txt ist nicht kritisch, solange sie sich im selben Verzeichnis befinden, das im Pfad der Systemvariablen angegeben ist.

set mailsend = mailsend1.17b15.exe - Gibt das Programm zum Senden eines Berichts an die E-Mail des Benutzers an. Der Brief wird vom Konto yandex.ru gesendet, von dem aus Dateien an die Cloud gesendet werden.

setze i = 1 - setze den Versuchszähler auf 1

call: loging "-----------------------------------" - ruft die Protokollierungsprozedur auf. Eine Zeile wird an die Prozedur übergeben, die dann in zwei Dateien geschrieben wird - die Protokolldatei % filebkp% -log.txt und eine separate Datei mit den aktuellen Vorgängen % filebkp% -log.tmp , die dann als Bericht über das Archivierungsergebnis an den Benutzer gesendet wird.

Dementsprechend zeigen die Protokollzeilen im Hauptteil der Skripte dem Benutzer gleichzeitig die während des Vorgangs ausgeführten Vorgänge, schreiben sie in die Protokolle und sind für mich Kommentare im Hauptteil des Skripts, die erklären, was in den folgenden Zeilen ausgeführt wird.

Dementsprechend führen das vollständige Kopierskript und das inkrementelle Kopierskript die folgenden Operationen aus:

  1. Für ein vollständiges Archiv - Erstellt Sicherungskopien der aktuellen Archive auf dem Server und auf dem lokalen Computer
  2. erstellt ein neues Backup
  3. versuchen, es an den Server zu senden
  4. Laden Sie nach dem Senden eine Sicherungskopie herunter und vergleichen Sie sie mit dem Original
  5. Wenn der Vergleich erfolgreich ist, sendet er ein Protokoll der Vorgänge an den Server und der Benutzer erhält über mailsend1.17b15.exe + einen Bericht über den erfolgreichen Vorgang für das vollständige Archiv. Löscht veraltete Versionen des Archivs
  6. Wenn zwischen den Dateien ein Unterschied besteht, wird versucht, die Datei erneut an den Server zu senden. Wenn der Versand innerhalb von 5 Versuchen fehlschlägt, wird das Betriebsprotokoll an den Server gesendet, und der Benutzer meldet den Fehler über mailsend1.17b15.exe:
  7. Bereinigt eine temporäre Datei mit aktuellen Vorgängen.

PS


Diese Skripte werden nur als Beispiele angegeben. Es besteht kein Wunsch, sie unter PowerShell neu zu schreiben, da Für mich ist es wichtig, dass es auf jedem System funktioniert, einschließlich Windows XP. Es gibt keinen Schutz vor Passwortdiebstahl, es wäre für mich interessant, was Sicherheitsexperten anbieten würden, aber die Trennung von Code und Passwörtern mit der Möglichkeit, Passwörter in einem anderen Verzeichnis abzulegen, verhindert zumindest die Möglichkeit eines dummen Fehlers, dass er beim Senden eines Skripts an einen Freund auch Passwörter erhält.

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


All Articles