การส่งเมลจากบรรทัดรับคำสั่งหากร่างกายไม่ว่างเปล่า


12

ฉันต้องการเขียนสคริปต์ง่ายๆที่เตือนฉันหากมีการเปลี่ยนแปลงบันทึก สำหรับตอนนี้ฉันกำลังใช้ grep เพื่อค้นหาบรรทัดที่ฉันสนใจตอนนี้มันใช้งานได้:

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

ปัญหาคือสิ่งนี้จะส่งจดหมายแม้ว่าจะไม่พบบรรทัดที่ตรงกัน ดูเหมือนว่ายูทิลิตี้เมลจาก mailutils นั้นไม่มีสวิตช์บอกให้ปล่อยเมลที่ไม่มีเนื้อหา

มีวิธีที่ง่ายและรวดเร็วในการทำเช่นนั้น?

คำตอบ:


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

หรือคุณสามารถทำให้มันกลายเป็นงาน cron และถ้ามันสร้างผลลัพธ์ใด ๆ มันจะส่งอีเมลถึงผู้ใช้ คุณสามารถแก้ไขไฟล์ / etc / aliases (จากนั้นเรียกใช้คำสั่ง newaliases) เพื่อส่งเมลไปยังที่อยู่ที่ไม่ได้อยู่ในกล่อง

นอกเหนือจาก cron entry (คุณจะไม่สามารถตั้งค่าหัวเรื่องบรรทัด thogh ได้

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

หรือคุณสามารถรับยูทิลิตี้ ifne - นี่อาจเป็นสิ่งที่คุณต้องการ

บรรทัด grep / var / log / file | ifne mail -s Log email@domain.tld

ifne สั่งให้มันใช้ได้จาก epel repo สำหรับ centos และ RHEL ฉันไม่พบลิงค์ไปยังหน้า man ออนไลน์ แต่มีอยู่

ifne (1)
ifne (1)

NAME ifne - รันคำสั่งหากอินพุตมาตรฐานไม่ว่างเปล่า

สรุปคำสั่ง ifne [-n]

DESCRIPTION ifne รันคำสั่งต่อไปนี้หากว่าอินพุตมาตรฐานไม่ว่างเปล่า

ตัวเลือก - การดำเนินการย้อนกลับ เรียกใช้คำสั่งหากอินพุตมาตรฐานใช้งานได้

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

ค้นหาตัวอย่าง -name core | ifne mail -s root "พบไฟล์หลัก"

AUTHOR ลิขสิทธิ์ 2008 โดย Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
โปรดทราบว่า grep จะออกจากที่ไม่ใช่ 0 หากไม่สร้างเอาต์พุตดังนั้นคุณสามารถทำได้: output = $ (บรรทัด grep / var / log / ไฟล์) && echo "$ output" | mail -s เข้าสู่ระบบ user@example.com
Sean Reifschneider

นอกจากนี้คำสั่งที่คุณแนะนำจะไม่ส่ง "$ output" ไปยังคำสั่ง mail :-)
Sean Reifschneider

ฉันขอแนะนำให้แก้ไขคำตอบเพื่อรวมโซลูชันที่เสนอโดย @Sean Reifschneider
Basil A

FYI ifneพบได้ในmoreutilsแพ็คเกจใน Ubuntu น่าเสียดายที่แพคเกจนี้นำมาparallelซึ่งความขัดแย้งกับparallelคำสั่งจากparallelแพคเกจ
artfulrobot

14

"man mail" บอกฉันว่าอาร์กิวเมนต์ -E stopps ส่งอีเมลถ้าร่างกายว่างเปล่า ทำงานได้ดีสำหรับฉัน

-E

หากข้อความที่ส่งออกไม่มีข้อความใด ๆ ในส่วนข้อความแรกหรือข้อความเดียวอย่าส่ง แต่ทิ้งไว้เงียบ ๆ ตั้งค่าตัวแปร skipemptybody ได้อย่างมีประสิทธิภาพเมื่อเริ่มต้นโปรแกรม สิ่งนี้มีประโยชน์สำหรับการส่งข้อความจากสคริปต์ที่เริ่มโดย cron (8)


3
บน Ubuntu 12.04 มีการติดตั้ง GNU Mailtools 2.1 และตัวเลือก "-E" สำหรับ "mail" จะมีชวเลขสำหรับ --exec มันไม่มีตัวเลือก "ร่างกายที่ว่างเปล่า"
Mark Stosberg

3
@MarkStosberg: Ubuntu มีแพ็คเกจสำรองหลายแบบที่ให้mailหรือmailxคำสั่ง bsd-mailxและheirloom-mailxแพคเกจทั้งสองให้mailxกับ-Eตัวเลือกที่อธิบายไว้ที่นี่
ออกแบบ Smylers

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.