कमांड लाइन से मेल भेजना यदि शरीर खाली नहीं है


12

मैं एक साधारण स्क्रिप्ट लिखना चाहूंगा जो मुझे लॉग इन करने पर सचेत करे। इसके लिए मैं grep का उपयोग उन पंक्तियों को खोजने के लिए कर रहा हूँ जिनकी मुझे दिलचस्पी है। अभी यह इस तरह काम करता है:

grep line /var/log/file | mail -s Log email@domain.tld

समस्या यह है कि यह मेल भेजता है, भले ही कोई मिलान रेखाएं न मिली हों। मेल यूटिलिटीज की मेल यूटिलिटी के पास ऐसा कोई स्विच नहीं है, जो यह बताता हो कि जो मेल खाली हैं, उन्हें ड्रॉप करना है।

क्या ऐसा करने का एक त्वरित और आसान तरीका है?

जवाबों:


12
output=$(grep line /var/log/file); [[ -n "$output" ]] && mail -s Log email@domain.tld

या आप इसे क्रॉन जॉब में बना सकते हैं और फिर यदि यह कोई आउटपुट देता है तो यह उपयोगकर्ताओं को ईमेल करेगा। आप बॉक्स पर नहीं पता करने के लिए मेल भेजने के लिए / etc / उपनाम फ़ाइल (और फिर newaliases कमांड चला सकते हैं) को संपादित कर सकते हैं।

क्रोन प्रविष्टि से बाहर (आप विषय पंक्ति को सेट नहीं कर पाएंगे

1 0 * * *  grep line /var/log/file

या आप ifne उपयोगिता प्राप्त कर सकते हैं - यह शायद आप क्या चाहते हैं

grep लाइन / var / log / फ़ाइल | ifne मेल -s लॉग ईमेल@domain.tld

Ifne कमांड सेंटो और आरएचईएल के लिए एपेल रेपो से यह उपलब्ध है। मुझे ऑनलाइन मैन पेज का लिंक नहीं मिल रहा है लेकिन यह है

ifne (1)
ifne (1)

NAME ifne - यदि मानक इनपुट खाली नहीं है, तो कमांड चलाएँ

SYNOPSIS ifne [-n] कमांड

वर्णन ifne निम्नलिखित कमांड चलाता है अगर और केवल अगर मानक इनपुट खाली नहीं है।

विकल्प-एक रिवर्स ऑपरेशन। यदि मानक इनपुट एम्पाय-टी है तो कमांड चलाएं।

          Note  that  if  the  standard  input  is not empty, it is passed
          through ifne in this case.

समान खोजो। -नाम कोर | ifne मेल -s "मूल फाइलें मिली" रूट

जेवियर मेरिनो द्वारा AUTHOR कॉपीराइट 2008

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
ध्यान दें कि अगर यह कोई आउटपुट उत्पन्न नहीं करता है, तो grep गैर-0 से बाहर निकल जाएगा, इसलिए आप ऐसा कर सकते हैं: आउटपुट = $ (grep लाइन / var / log / file) && echo "$ output" | मेल -s लॉग इन करें user@example.com
सीन रिफ़्शिनडर

इसके अलावा, आपका सुझाव दिया कमांड "$ आउटपुट" मेल कमांड को नहीं भेजता है। :-)
सीन रिफ़्शिनडर

मैं प्रस्तावित उत्तर को @Sif Reifschneider द्वारा शामिल करने का सुझाव देना चाहूंगा
तुलसी A

FYI करें ubuntu में पैकेज में ifneपाया जाता है moreutils। दुर्भाग्य से वह पैकेज भी लाता है parallelजिसमें पैकेज parallelसे कमांड के साथ टकराव होता है parallel
Artfulrobot

14

"मैन मेल" मुझे बताता है कि तर्क-ई स्टॉप मेल्स भेज रहा है अगर शरीर खाली है। मेरे लिए ठीक काम करता है।

-इ

यदि किसी आउटगोइंग संदेश में उसके पहले या एकमात्र संदेश भाग में कोई पाठ नहीं है, तो उसे भेजें नहीं, लेकिन चुपचाप छोड़ दें, प्रभावी रूप से प्रोग्राम स्टार्टअप पर Skipemptybody चर सेट कर रहा है। यह क्रोन (8) द्वारा शुरू की गई लिपियों से संदेश भेजने के लिए उपयोगी है।


3
Ubuntu 12.04 पर, GNU Mailtools 2.1 स्थापित है, और "mail" के लिए "-E" विकल्प --exec के लिए एक शॉर्टहैंड है। इसमें "खाली निकाय" विकल्प नहीं है।
मार्क स्टोसबर्ग

3
@MarkStosberg: उबंटू में एक mailया mailxकमांड देने वाले कई वैकल्पिक पैकेज हैं । bsd-mailxऔर heirloom-mailxसंकुल दोनों एक प्रदान mailxके साथ -Eविकल्प यहाँ का वर्णन किया।
स्माइलर्स

1
CentOS 6.5 पर मेरे लिए काम किया:grep "find me" /var/log/something | mail -s "That text you were looking for is now in the logs" -E mail@example.com
user2208096

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.