كيفية استخدام برنامج Bash النصي لإدارة تنزيل الملفات وعرضها من حاوية AWS S3

كما يمكنك أن تقرأ في هذه المقالة ، فقد واجهت مؤخرًا بعض المشاكل مع خادم البريد الإلكتروني الخاص بي وقررت الاستعانة بمصادر خارجية لإدارة البريد الإلكتروني لخدمة البريد الإلكتروني البسيط من أمازون (SES).

كانت المشكلة في هذا الحل هي أنني قمت بحفظ SES للرسائل الجديدة في حاوية S3 ، واستخدام AWS Management Console لقراءة الملفات داخل حاويات S3 أصبح قديمًا حقًا.

لذلك قررت كتابة نص Bash لأتمتة عملية التنزيل والتخزين وعرض الرسائل الجديدة بشكل صحيح.

بينما كتبت هذا البرنامج النصي لاستخدامه على سطح مكتب Ubuntu Linux ، لن يتطلب الأمر الكثير من العبث لجعله يعمل على نظام macOS أو Windows 10 من خلال Windows SubSystem for Linux.

هذا هو النص الكامل في قطعة واحدة. بعد أن تأخذ بضع لحظات لإلقاء نظرة عليها ، سوف أطلعك عليها خطوة بخطوة.

#!/bin/bash # Retrieve new messages from S3 and save to tmpemails/ directory: aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount # Set location variables: tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/ # Create new directory to store today's messages: today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today" # Give the message files readable names: for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done # Open new files in Gedit: for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done

سنبدأ بالأمر الفردي لتنزيل أي رسائل موجودة حاليًا في دلو S3 الخاص بي (بالمناسبة ، لقد قمت بتغيير أسماء الحاوية وأنظمة الملفات الأخرى وتفاصيل المصادقة لحماية خصوصيتي).

aws s3 cp \ --recursive \ s3://bucket-name/ \ /home/david/s3-emails/tmpemails/ \ --profile myaccount

بالطبع ، لن يعمل هذا إلا إذا قمت بالفعل بتثبيت وتهيئة AWS CLI لنظامك المحلي. حان الوقت الآن للقيام بذلك إذا لم تكن قد فعلت ذلك بالفعل.

و حزب المحافظين يقف الأوامر ل"نسخة منه" --recursive يروي CLI لتطبيق العملية حتى إلى كائنات متعددة، S3: // دلو اسم نقطة لبلدي دلو (واسم دلو يكون من الواضح مختلفة)، و/ الوطن / ديفيد ... السطر هو عنوان نظام الملفات المطلق الذي أرغب في نسخ الرسائل إليه ، وتخبر الوسيطة --profile CLI أيًا من حسابات AWS المتعددة الخاصة بي أشير إليها.

يحدد القسم التالي متغيرين سيجعلان من الأسهل بالنسبة لي تحديد مواقع أنظمة الملفات من خلال بقية البرنامج النصي.

tmp_file_location=/home/david/s3-emails/tmpemails/* base_location=/home/david/s3-emails/emails/

لاحظ كيف تنتهي قيمة المتغير tmp_file_location بعلامة النجمة. هذا لأنني أريد أن أشير إلى الملفات الموجودة داخل هذا الدليل ، بدلاً من الدليل نفسه.

سأقوم بإنشاء دليل دائم جديد داخل ... / البريد الإلكتروني / التسلسل الهرمي لتسهيل العثور على الرسائل لاحقًا. سيكون اسم هذا الدليل الجديد هو التاريخ الحالي.

today=$(date +"%m_%d_%Y") [[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"

أقوم أولاً بإنشاء متغير shell جديد يسمى اليوم والذي سيتم ملؤه بإخراج التاريخ + "٪ m_٪ d_٪ Y" الأمر. يقوم التاريخ نفسه بإخراج التاريخ / الطابع الزمني بالكامل ، ولكن ما يلي ( "٪ m_٪ d_٪ Y" ) يعدل ذلك الناتج إلى تنسيق أبسط وأكثر قابلية للقراءة.

بعد ذلك ، أختبر وجود اسم يستخدم هذا الاسم بشكل مباشر - مما يشير إلى أنني تلقيت بالفعل رسائل بريد إلكتروني في ذلك اليوم ، وبالتالي ، ليست هناك حاجة لإعادة إنشاء الدليل. إذا كان هذا الدليل غير موجود (||) ، فسيقوم mkdir بإنشائه من أجلي. إذا لم تقم بإجراء هذا الاختبار ، فقد يعرض الأمر رسائل خطأ مزعجة.

نظرًا لأن Amazon SES يعطي أسماء قبيحة وغير قابلة للقراءة لكل رسالة تسقطها في دلو S3 الخاص بي ، سأقوم الآن بإعادة تسميتها ديناميكيًا بينما ، في نفس الوقت ، نقلها إلى منزلهم الجديد (في الدليل القديم الذي أنشأته للتو) .

for FILE in $tmp_file_location do mv $FILE ${base_location}/${today}/email$(rand) done

و ل... هل ... تم وحلقة قراءة كل من الملفات في الدليل ممثلة $ tmp_file_location متغير ومن ثم نقله إلى الدليل أنا خلقت فقط (ويمثلها $ base_location متغير بالإضافة إلى القيمة الحالية لل $ اليوم ).

كجزء من نفس العملية ، سأعطيها اسمها الجديد ، السلسلة " email " متبوعة برقم عشوائي تم إنشاؤه بواسطة الأمر rand . قد تحتاج إلى تثبيت مولد أرقام عشوائي: سيكون مناسبًا لتثبيت rand على Ubuntu.

قام إصدار سابق من البرنامج النصي بإنشاء أسماء تم تمييزها بأرقام متسلسلة أقصر تم زيادتها باستخدام عدد = 1 ... count = $ ((count + 1)) منطق داخل حلقة for . كان ذلك جيدًا طالما أنني لم أتلق أكثر من دفعة واحدة من الرسائل في نفس اليوم. إذا فعلت ذلك ، فستحل الرسائل الجديدة محل الملفات القديمة في دليل ذلك اليوم.

أعتقد أنه من الممكن رياضيًا أن يقوم أمر rand الخاص بي بتعيين أرقام متداخلة لملفين ، ولكن نظرًا لأن النطاق الافتراضي الذي يستخدمه rand يتراوح بين 1 و 32،576 ، فهذه مخاطرة أرغب في تحملها.

في هذه المرحلة ، يجب أن تكون هناك ملفات في الدليل الجديد بأسماء مثل email3039 ، و email25343 ، وما إلى ذلك لكل رسالة من الرسائل الجديدة التي أرسلتها إلي.

يظهر لي تشغيل أمر الشجرة على نظامي الخاص أنه تم حفظ خمس رسائل في دليلي 02_27_2020 ، وواحدة أخرى في 02_28_2020 (تم إنشاء هذه الملفات باستخدام الإصدار الأقدم من البرنامج النصي الخاص بي ، لذلك تم ترقيمها بالتسلسل).

لا توجد ملفات حاليًا في tmpemails - وذلك لأن الأمر mv ينقل الملفات إلى موقعها الجديد ، دون ترك أي شيء خلفه.

$ tree . ├── emails │   ├── 02_27_2020 │   │   ├── email1 │   │   ├── email2 │   │   ├── email3 │   │   ├── email4 │   │   ├── email5 │   └── 02_28_2020 │   └── email1 └── tmpemails

يفتح القسم الأخير من البرنامج النصي كل رسالة جديدة في محرر نصوص سطح المكتب المفضل لدي (Gedit). إنه يستخدم حلقة مماثلة لـ ... do ... done ، وهذه المرة تقرأ أسماء كل ملف في الدليل الجديد (يشار إليها باستخدام الأمر " today ") ثم فتح الملف في Gedit. لاحظ العلامة النجمية التي أضفتها إلى نهاية موقع الدليل.

for NEWFILE in ${base_location}/${today}/* do gedit $NEWFILE done

لا يزال هناك شيء آخر يجب القيام به. إذا لم أقم بتنظيف حاوية S3 الخاصة بي ، فسيتم تنزيل جميع الرسائل المتراكمة في كل مرة أقوم فيها بتشغيل البرنامج النصي. سيؤدي ذلك إلى زيادة صعوبة إدارتها بشكل تدريجي.

لذلك ، بعد تنزيل رسائلي الجديدة بنجاح ، قمت بتشغيل هذا البرنامج النصي القصير لحذف جميع الملفات الموجودة في المجموعة:

#!/bin/bash # Delete all existing emails aws s3 rm --recursive s3://bucket-name/ --profile myaccount