जैसा कि आप इस लेख में पढ़ सकते हैं, मुझे हाल ही में अपने ईमेल सर्वर में कुछ परेशानी हुई और मैंने अमेज़ॅन की सरल ईमेल सेवा (एसईएस) को ईमेल प्रशासन को आउटसोर्स करने का फैसला किया।
उस समाधान के साथ समस्या यह थी कि मैंने एसईएस को एस 3 बाल्टी में नए संदेशों को सहेजा था, और एस 3 बाल्टी के भीतर फाइलों को पढ़ने के लिए एडब्ल्यूएस प्रबंधन कंसोल का उपयोग करके वास्तव में तेजी से पुराना हो जाता है।
इसलिए मैंने नए संदेशों को डाउनलोड करने, ठीक से संग्रहीत करने और देखने की प्रक्रिया को स्वचालित करने के लिए एक बैश स्क्रिप्ट लिखने का निर्णय लिया।
जबकि मैंने यह स्क्रिप्ट अपने उबंटू लिनक्स डेस्कटॉप पर उपयोग के लिए लिखी थी, इसे लिनक्स के लिए विंडोज सबसिस्टम के माध्यम से मैकओएस या विंडोज 10 सिस्टम पर काम करने के लिए बहुत अधिक फिडलिंग की आवश्यकता नहीं होगी।
यहाँ पूरी स्क्रिप्ट सभी एक टुकड़े में है। आपके द्वारा इसे देखने के लिए कुछ क्षण लेने के बाद, मैं आपको इसके बारे में एक बार में एक कदम बताऊंगा।
#!/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 को पहले ही इंस्टॉल और कॉन्फ़िगर कर लिया हो। अब ऐसा करने का समय आ गया है यदि आपने पहले से ऐसा नहीं किया है।
सीपी कमांड का अर्थ है "कॉपी," --रिकर्सिव सीएलआई को कई ऑब्जेक्ट्स पर भी ऑपरेशन लागू करने के लिए कहता है, s3://bucket-name मेरी बकेट की ओर इशारा करता है (आपका बकेट नाम स्पष्ट रूप से अलग होगा), /home/david... लाइन एक संपूर्ण फाइल सिस्टम पता है जिस पर मैं संदेशों की प्रतिलिपि बनाना चाहता हूं, और --प्रोफाइल तर्क सीएलआई को बताता है कि मैं अपने कई एडब्ल्यूएस खातों में से किसका जिक्र कर रहा हूं।
अगला खंड दो चर सेट करता है जो मेरे लिए बाकी स्क्रिप्ट के माध्यम से फाइल सिस्टम स्थानों को निर्दिष्ट करना बहुत आसान बना देगा।
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"
मैं सबसे पहले आज . नाम का एक नया शेल वैरिएबल बनाता हूं जो दिनांक +"%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 . द्वारा दर्शाया गया है) $आज . के वर्तमान मूल्य के अतिरिक्त चर )
उसी ऑपरेशन के हिस्से के रूप में, मैं इसे इसका नया नाम दूंगा, स्ट्रिंग "ईमेल " इसके बाद रैंड . द्वारा उत्पन्न एक यादृच्छिक संख्या होती है आज्ञा। आपको एक यादृच्छिक संख्या जनरेटर स्थापित करने की आवश्यकता हो सकती है:वह होगा उपयुक्त इंस्टॉल रैंड उबंटू पर।
स्क्रिप्ट के पुराने संस्करण ने छोटे, अनुक्रमिक संख्याओं द्वारा विभेदित नाम बनाए, जिन्हें गिनती=1...गिनती=$((गिनती+1)) का उपयोग करके बढ़ाया गया था के लिए . के भीतर तर्क फंदा। यह तब तक ठीक रहा जब तक मुझे एक ही दिन में संदेशों के एक से अधिक बैच प्राप्त नहीं हुए। अगर मैंने किया, तो नए संदेश उस दिन की निर्देशिका में पुरानी फाइलों को अधिलेखित कर देंगे।
मुझे लगता है कि यह गणितीय रूप से संभव है कि मेरा रैंड कमांड दो फाइलों को ओवरलैपिंग नंबर असाइन कर सकता है, लेकिन यह देखते हुए कि डिफ़ॉल्ट रेंज रैंड . है उपयोग 1 और 32,576 के बीच है, यह एक ऐसा जोखिम है जिसे मैं लेने को तैयार हूं।
इस बिंदु पर, मेरे द्वारा भेजे गए प्रत्येक नए संदेश के लिए नई निर्देशिका में ईमेल 3039, ईमेल25343, आदि नामों के साथ फ़ाइलें होनी चाहिए।
पेड़ चल रहा है मेरे अपने सिस्टम पर कमांड मुझे दिखाता है कि पांच संदेश मेरी 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 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