जैसा कि आप इस लेख में पढ़ सकते हैं, मुझे हाल ही में अपने ईमेल सर्वर के साथ कुछ परेशानी हुई और मैंने ईमेल प्रशासन को Amazon की सिंपल ईमेल सर्विस (SES) को आउटसोर्स करने का फैसला किया।
उस समाधान के साथ समस्या यह थी कि मेरे पास SES नए संदेशों को S3 बकेट में सेव करता था, और S3 बकेट के भीतर फाइलों को पढ़ने के लिए AWS मैनेजमेंट कंसोल का उपयोग करना वास्तव में तेजी से बासी हो जाता है।
इसलिए मैंने नए संदेशों को डाउनलोड करने, ठीक से संग्रहीत करने और देखने की प्रक्रिया को स्वचालित करने के लिए एक Bash स्क्रिप्ट लिखने का फैसला किया।
जबकि मैंने इस स्क्रिप्ट को अपने Ubuntu Linux डेस्कटॉप पर उपयोग के लिए लिखा था, इसे macOS या Windows 10 सिस्टम पर Windows SubSystem for Linux के माध्यम से काम करने के लिए बहुत अधिक बदलाव की आवश्यकता नहीं होगी।
यहां पूरा स्क्रिप्ट एक ही टुकड़े में है। इसे देखने के लिए कुछ क्षण लें, फिर मैं आपको इसके माध्यम से एक बार में एक कदम चलूंगा।
#!/bin/bash
# S3 से नए संदेश पुनर्प्राप्त करें और tmpemails/ डायरेक्टरी में सेव करें:
aws s3 cp \
--recursive \
s3://bucket-name/ \
/home/david/s3-emails/tmpemails/ \
--profile myaccount
# स्थान वेरिएबल सेट करें:
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/
# आज के संदेशों को संग्रहीत करने के लिए नई डायरेक्टरी बनाएं:
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
# संदेश फाइलों को पढ़ने योग्य नाम दें:
for FILE in $tmp_file_location
do
mv $FILE ${base_location}/${today}/email$(rand)
done
# 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 इंस्टॉल और कॉन्फ़िगर किया है। यदि आपने अभी तक नहीं किया है तो अब ऐसा करने का समय है।
cp कमांड "कॉपी" के लिए है, --recursive CLI को ऑपरेशन को कई ऑब्जेक्ट पर भी लागू करने के लिए कहता है, s3://bucket-name मेरे बकेट की ओर इशारा करता है (आपका बकेट नाम स्पष्ट रूप से अलग होगा), /home/david... लाइन वह एब्सोल्यूट फाइल सिस्टम एड्रेस है जिस पर मैं संदेशों को कॉपी करना चाहता हूं, और --profile आर्गुमेंट CLI को बताता है कि मेरे कई AWS अकाउंट में से किसे मैं संदर्भित कर रहा हूं।
अगला खंड दो वेरिएबल सेट करता है जो स्क्रिप्ट के बाकी हिस्सों के माध्यम से फाइल सिस्टम स्थानों को निर्दिष्ट करना मेरे लिए बहुत आसान बना देगा।
tmp_file_location=/home/david/s3-emails/tmpemails/*
base_location=/home/david/s3-emails/emails/
ध्यान दें कि tmp_file_location वेरिएबल का मान एक एस्टेरिस्क के साथ समाप्त होता है। ऐसा इसलिए है क्योंकि मैं उस डायरेक्टरी के बजाय उस डायरेक्टरी के अंदर की फाइलों को संदर्भित करना चाहता हूं।
मैं .../emails/ पदानुक्रम के भीतर एक नई स्थायी डायरेक्टरी बनाऊंगा ताकि बाद में संदेशों को ढूंढना मेरे लिए आसान हो। इस नई डायरेक्टरी का नाम वर्तमान तारीख होगा।
today=$(date +"%m_%d_%Y")
[[ -d ${base_location}/"$today" ]] || mkdir ${base_location}/"$today"
मैं पहले today नाम का एक नया शेल वेरिएबल बनाता हूं जिसे date +"%m_%d_%Y" कमांड के आउटपुट द्वारा भरा जाएगा। date स्वयं पूर्ण तारीख/टाइमस्टैम्प आउटपुट करता है, लेकिन उसके बाद आने वाला ("%m_%d_%Y") उस आउटपुट को एक सरल और अधिक पठनीय प्रारूप में संपादित करता है।
मैं फिर उस नाम का उपयोग करके एक डायरेक्टरी के अस्तित्व का परीक्षण करता हूं - जो इंगित करेगा कि मुझे उस दिन पहले ही ईमेल प्राप्त हो चुके हैं और इसलिए डायरेक्टरी को फिर से बनाने की कोई आवश्यकता नहीं है। यदि ऐसी डायरेक्टरी नहीं मौजूद है (||), तो mkdir इसे मेरे लिए बनाएगा। यदि आप यह परीक्षण नहीं चलाते हैं, तो आपका कमांड कष्टप्रद त्रुटि संदेश लौटा सकता है।
चूंकि Amazon SES अपने S3 बकेट में ड्रॉप किए गए प्रत्येक संदेश को बदसूरत और अपठनीय नाम देता है, मैं अब उन्हें डायनामिकली रीनेम करूंगा, जबकि साथ ही उन्हें उनके नए घर (मेरे द्वारा अभी बनाई गई दिनांकित डायरेक्टरी) में ले जाऊंगा।
for FILE in $tmp_file_location
do
mv $FILE ${base_location}/${today}/email$(rand)
done
for...do...done लूप $tmp_file_location वेरिएबल द्वारा दर्शाई गई डायरेक्टरी में प्रत्येक फाइल को पढ़ेगा और फिर उसे मेरे द्वारा अभी बनाई गई डायरेक्टरी ( $base_location वेरिएबल द्वारा दर्शाई गई और साथ ही $today के वर्तमान मान) में ले जाएगा।
उसी ऑपरेशन के भाग के रूप में, मैं इसे इसका नया नाम दूंगा, स्ट्रिंग "email" जिसके बाद rand कमांड द्वारा उत्पन्न एक रैंडम नंबर होगा। आपको रैंडम नंबर जनरेटर इंस्टॉल करने की आवश्यकता हो सकती है: Ubuntu पर यह apt install rand होगा।
स्क्रिप्ट के पहले के संस्करण ने छोटे, क्रमिक नंबरों का उपयोग करके नाम बनाए थे जिन्हें for लूप के भीतर count=1...count=$((count+1)) लॉजिक का उपयोग करके बढ़ाया गया था। यह तब तक ठीक काम करता था जब तक मुझे उसी दिन एक से अधिक बैच में संदेश प्राप्त नहीं होते। यदि मैंने किया, तो नए संदेश उस दिन की डायरेक्टरी में पुरानी फाइलों को ओवरराइट कर देंगे।
मेरा अनुमान है कि मेरा rand कमांड गणितीय रूप से दो फाइलों को ओवरलैपिंग नंबर असाइन कर सकता है, लेकिन चूंकि rand द्वारा उपयोग की जाने वाली डिफ़ॉल्ट रेंज 1 और 32,576 के बीच है, यह एक ऐसा जोखिम है जिसे मैं लेने को तैयार हूं।
इस बिंदु पर, नई डायरेक्टरी में email3039, email25343, आदि जैसे नामों वाली फाइलें होनी चाहिए, मेरे द्वारा भेजे गए प्रत्येक नए संदेश के लिए।
मेरे अपने सिस्टम पर tree कमांड चलाने से पता चलता है कि पांच संदेश मेरे 02_27_2020 डायरेक्टरी में सेव किए गए थे, और एक और 02_28_2020 में (ये फाइलें मेरे स्क्रिप्ट के पुराने संस्करण का उपयोग करके उत्पन्न हुई थीं, इसलिए वे क्रमिक रूप से नंबर की गई हैं)।
वर्तमान में tmpemails में कोई फाइल नहीं है - ऐसा इसलिए है क्योंकि mv कमांड फाइलों को उनके नए स्थान पर ले जाता है, कुछ भी पीछे नहीं छोड़ता।
$ tree .
├── emails
│ ├── 02_27_2020
│ │ ├── email1
│ │ ├── email2
│ │ ├── email3
│ │ ├── email4
│ │ └── email5
│ └── 02_28_2020
│ └── email1
└── tmpemails
स्क्रिप्ट का अंतिम खंड प्रत्येक नए संदेश को मेरे पसंदीदा डेस्कटॉप टेक्स्ट एडिटर (Gedit) में खोलता है। यह एक समान for...do...done लूप का उपयोग करता है, इस बार नई डायरेक्टरी में प्रत्येक फाइल के नाम पढ़ता है ( "today" कमांड का उपयोग करके संदर्भित) और फिर फाइल को Gedit में खोलता है। ध्यान दें कि मैंने डायरेक्टरी स्थान के अंत में एस्टेरिस्क जोड़ा है।
for NEWFILE in ${base_location}/${today}/*
do
gedit $NEWFILE
done
अभी एक और चीज करनी है। यदि मैं अपने S3 बकेट को साफ नहीं करता, तो यह हर बार स्क्रिप्ट चलाने पर सभी संचित संदेशों को डाउनलोड करेगा। इससे इसे प्रबंधित करना उत्तरोत्तर कठिन हो जाएगा।
इसलिए, अपने नए संदेशों को सफलतापूर्वक डाउनलोड करने के बाद, मैं इस छोटी स्क्रिप्ट को बकेट में सभी फाइलों को हटाने के लिए चलाता हूं:
#!/bin/bash
# सभी मौजूदा ईमेल हटाएं
aws s3 rm --recursive s3://bucket-name/ --profile myaccount