Cadangan data yang cepat dan andal ke cloud 2

Dalam artikel saya sebelumnya , saya menjelaskan contoh skrip yang dapat mengarsipkan dan mengunggah sejumlah file pengguna ke cloud tanpa keikutsertaannya, sehingga memberikan cadangan file pengguna yang paling sederhana. Script memberikan penutupan masalah berikut:

  • cepat (sempurna di latar belakang);
  • Itu akan menjaga versi file saat ini dan yang sebelumnya;
  • penyimpanan file tidak akan dapat diakses oleh virus atau bencana alam seperti penghancuran operator atau pencuriannya;
  • isi dari salinan cadangan hanya dapat diakses oleh pengguna, yaitu dilindungi kata sandi.

Secara alami, kesederhanaan naskah berubah menjadi kekurangannya, yaitu:

  • Menyimpan kata sandi di badan skrip. Ya, banyak program menyimpan kata sandi yang tidak dienkripsi dalam file teks, dan perlindungan data ini terjadi melalui kontrol akses ke file, tetapi masih mengekstraksi kata sandi dari kode adalah pertanda bentuk yang baik dan perlindungan minimal jika skrip kerja masuk ke tangan yang salah. .
  • Kurangnya verifikasi penyelesaian operasi yang berhasil, dan kembalikan ke keadaan sebelumnya jika operasi tidak selesai dengan sukses.
  • Kurang mencatat dan memberitahukan pengguna tentang keberhasilan operasi jika skrip dijalankan melalui penjadwal tugas.

Dalam hal ini, kode skrip untuk arsip penuh dan tambahan dilengkapi dengan fungsionalitas yang diperlukan. Untuk deskripsi umum, lihat artikel sebelumnya , di sini saya hanya ingin membahas perubahan.

Script untuk membuat arsip lengkap


@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 untuk membuat arsip tambahan


 @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 

Tim baru:


call pass.bat xx x - panggil program eksternal yang mengembalikan variabel xx dengan nilai yang ditentukan untuk pengidentifikasi x.

Dengan demikian, variabel pengguna diberi nilai yang terkait dengan pengidentifikasi 1 (nama pengguna akun yandex), pass - 2 (kata sandi akun yandex), pwd - 3 (kata sandi ke arsip), penerima - 4 (surat, tempat mengirim log operasi).

Skrip pass.bat diberikan secara kondisional, metode proteksi kata sandi dapat dipilih berbeda, tetapi bagi mereka opsi ini juga cocok, saya memberikan kode paling sederhana untuk skrip ini:

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

Ketika dipanggil, kode ini menempatkan file pass.txt di sebelahnya, dan menugaskan ke variabel yang namanya ditentukan dalam argumen pertama dari skrip panggilan nilai dari baris file pass.txt yang jumlahnya ditunjukkan dalam argumen kedua dari panggilan skrip. Lokasi file pass.bat dan pass.txt tidak kritis, selama mereka berada di direktori yang sama seperti yang ditentukan dalam jalur variabel sistem.

set mailsend = mailsend1.17b15.exe - menunjukkan program untuk mengirim laporan ke email pengguna. Surat itu dikirim dari akun yandex.ru, dari mana file dikirim ke cloud.

set i = 1 - atur penghitung upaya ke 1

call: loging "-----------------------------------" - panggil prosedur logging. Baris dilewatkan ke prosedur, yang kemudian ditulis menjadi 2 file - file log % filebkp% -log.txt dan file terpisah dari operasi saat ini % filebkp% -log.tmp , yang kemudian dikirim kepada pengguna sebagai laporan hasil pengarsipan.

Oleh karena itu, baris logging di tubuh skrip secara bersamaan menunjukkan kepada pengguna operasi yang dilakukan selama operasi, menulisnya ke log dan bagi saya adalah komentar di tubuh skrip yang menjelaskan apa yang dilakukan pada baris berikut.

Dengan demikian, skrip salinan lengkap dan skrip inkremental melakukan operasi berikut:

  1. untuk arsip lengkap - membuat salinan cadangan arsip saat ini di server dan di komputer lokal
  2. membuat cadangan baru
  3. mencoba mengirimkannya ke server
  4. setelah mengirim, unduh salinan cadangan dan bandingkan dengan aslinya
  5. jika perbandingan berhasil, ia mengirimkan log operasi ke server dan pengguna menerima laporan tentang operasi yang sukses melalui mailsend1.17b15.exe + untuk arsip lengkap, menghapus versi lama dari arsip
  6. jika ada perbedaan antara file, ia mencoba mengirim file lagi ke server, dan jika gagal mengirim dalam waktu 5 upaya, ia mengirim log operasi ke server dan pengguna melaporkan kegagalan melalui mailsend1.17b15.exe:
  7. membersihkan file sementara dari operasi saat ini.

PS


Skrip ini diberikan hanya sebagai contoh, karena tidak ada keinginan untuk menulis ulang di bawah PowerShell, karena Penting bagi saya untuk bekerja pada sistem apa pun, termasuk Windows XP. Tidak ada perlindungan terhadap pencurian kata sandi, akan menarik bagi saya sendiri apa yang akan ditawarkan oleh pakar keamanan, tetapi pemisahan kode dan kata sandi dengan kemampuan untuk menempatkan kata sandi di direktori lain setidaknya menghilangkan kemungkinan kesalahan bodoh bahwa ketika mengirim skrip ke teman, ia juga akan mendapatkan kata sandi.

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


All Articles