في مقالتي السابقة
، وصفت مثالًا نصيًا يمكنه أرشفة وتحميل كمية معينة من ملفات المستخدم إلى الشبكة السحابية دون مشاركتها ، مما يوفر أبسط نسخة احتياطية لملفات المستخدم. يوفر البرنامج النصي إغلاق المشكلات التالية:
- سريع (مثالي في الخلفية) ؛
- سيحتفظ بالإصدار الحالي من الملفات والإصدارات السابقة ؛
- لن يكون تخزين الملفات في متناول الفيروسات أو الكوارث الطبيعية مثل تدمير الوسيط أو سرقته ؛
- يمكن الوصول إلى محتويات النسخة الاحتياطية فقط للمستخدم ، أي كان محمي بكلمة مرور.
بطبيعة الحال ، تحولت بساطة البرنامج إلى عيوبه ، وهي:
- تخزين كلمات المرور في نص البرنامج النصي. نعم ، تقوم العديد من البرامج بتخزين كلمات المرور غير المشفرة في ملفات نصية ، وتحدث حماية هذه البيانات من خلال التحكم في الوصول إلى الملفات ، ولكن لا يزال استخراج كلمة المرور من الكود هو علامة على الذوق الرفيع والحماية الدنيا في حالة وقوع البرنامج النصي في الأيدي الخطأ بطريقة أو بأخرى. .
- عدم التحقق من الإكمال الناجح للعملية ، والتراجع إلى الحالة السابقة إذا لم يتم إكمال العملية بنجاح.
- عدم وجود تسجيل وإخطار المستخدم بنجاح العملية إذا تم تشغيل البرنامج النصي من خلال برنامج جدولة المهام.
في هذا الصدد ، تم استكمال شفرة البرنامج النصي للأرشيف الكامل والتدريجي بالوظائف اللازمة. للحصول على وصف عام ، راجع
المقالة السابقة ، وهنا أود أن أتناول فقط التغييرات.
النصي لإنشاء أرشيف كامل
@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
البرنامج النصي لإنشاء أرشيف تزايدي
@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
فرق جديدة:
call pass.bat xx x - استدعاء برنامج خارجي يُرجع المتغير
xx بالقيمة المحددة لمعرف x.
وفقًا لذلك ، يتم تعيين متغير المستخدم قيمة مرتبطة بالمعرف 1 (اسم مستخدم حساب yandex) ، وتمرير - 2 (كلمة مرور حساب yandex) ، pwd - 3 (كلمة المرور إلى الأرشيف) ، المستلم - 4 (البريد ، حيث يتم إرسال سجل التشغيل).
يتم إعطاء البرنامج النصي pass.bat بشكل مشروط ، ويمكن اختيار طريقة حماية كلمة المرور بشكل مختلف ، لكن بالنسبة لأولئك الذين يعد هذا الخيار مناسبًا أيضًا ، أقدم أبسط رمز لهذا البرنامج النصي:
for /f "usebackq delims=" %%i in (`find /n /v "" "%~dp0"pass.txt ^| find "[%2]"`) do ( set newvar=%%i ) set %1=%newvar:~3%
عندما يتم استدعاؤه ، يحدد هذا الرمز ملف pass.txt المجاور له ، ويعين المتغير الذي تم تحديد اسمه في الوسيطة الأولى من البرنامج النصي استدعاء قيمة سطر ملف pass.txt الذي يشار إلى رقمه في الوسيطة الثانية لاستدعاء البرنامج النصي. موقع ملفات pass.bat و pass.txt غير حاسم ، طالما أنها موجودة في نفس الدليل كما هو محدد في مسار متغير النظام.
set mailsend = mailsend1.17b15.exe - يشير إلى برنامج إرسال تقرير إلى بريد المستخدم. يتم إرسال الرسالة من حساب yandex.ru ، حيث يتم إرسال الملفات إلى السحابة.
اضبط i = 1 - اضبط عداد المحاولة على 1
call: loging "-----------------------------------" - استدعاء إجراء التسجيل. يتم تمرير سطر إلى الإجراء ، والذي يتم كتابته بعد ذلك في ملفين - ملف السجل
٪ filebkp٪ -log.txt وملف منفصل للعمليات الحالية
٪ filebkp٪ -log.tmp ، والذي يتم إرساله بعد ذلك إلى المستخدم كتقرير عن نتيجة الأرشفة.
وفقًا لذلك ، تُظهر خطوط التسجيل في نصوص البرامج النصية للمستخدم في نفس الوقت العمليات التي يتم إجراؤها أثناء العملية ، ثم اكتبها إلى السجلات ، وتُعتبر بالنسبة لي تعليقات في نص البرنامج النصي تشرح ما يتم تنفيذه على الأسطر التالية.
وفقًا لذلك ، يقوم البرنامج النصي للنسخ الكاملة والبرنامج النصي للنسخ التدريجي بتنفيذ العمليات التالية:
- للأرشيف الكامل - يقوم بإنشاء نسخ احتياطية من الأرشيفات الحالية على الخادم وعلى الكمبيوتر المحلي
- يخلق نسخة احتياطية جديدة
- تحاول إرساله إلى الخادم
- بعد الإرسال ، قم بتنزيل نسخة احتياطية ومقارنتها بالأصل
- إذا نجحت المقارنة ، فسوف تقوم بإرسال سجل العمليات إلى الخادم ويتلقى المستخدم تقريرًا عن العملية الناجحة عبر mailsend1.17b15.exe + للأرشيف الكامل ، ويحذف الإصدارات القديمة من الأرشيف
- إذا كان هناك فرق بين الملفات ، فإنه يحاول إرسال الملف مرة أخرى إلى الخادم ، وإذا فشل في الإرسال في غضون 5 محاولات ، فإنه يرسل سجل التشغيل إلى الخادم ويبلغ المستخدم عن الفشل عبر mailsend1.17b15.exe:
- ينظف ملف مؤقت من العمليات الحالية.
PS
يتم إعطاء هذه النصوص فقط كأمثلة ، ليست هناك رغبة في إعادة الكتابة تحت PowerShell ، لأن من المهم بالنسبة لي أن يعمل على أي نظام ، بما في ذلك نظام التشغيل Windows XP. لا توجد حماية ضد سرقة كلمة المرور ، سيكون من المثير للاهتمام بنفسي ما سيقدمه خبراء الأمن ، ولكن فصل الشفرة وكلمات المرور مع القدرة على وضع كلمات المرور في دليل آخر يلغي على الأقل احتمال وجود خطأ غبي أنه عند إرسال برنامج نصي إلى صديق ، سوف يحصل أيضًا على كلمات مرور.