Gửi thư từ dòng lệnh nếu cơ thể không trống


12

Tôi muốn viết một tập lệnh đơn giản thông báo cho tôi nếu nhật ký thay đổi. Đối với điều này, tôi đang sử dụng grep để tìm các dòng tôi quan tâm. Ngay bây giờ nó hoạt động như thế này:

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

Vấn đề là điều này sẽ gửi thư ngay cả khi không tìm thấy dòng phù hợp. Tiện ích thư từ mailutils dường như không có công tắc nào bảo nó bỏ thư có phần thân trống.

Có một cách nhanh chóng và dễ dàng để làm như vậy?

Câu trả lời:


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

Hoặc bạn có thể biến điều này thành một công việc định kỳ và sau đó nếu nó tạo ra bất kỳ đầu ra nào, nó sẽ gửi email cho người dùng. Bạn có thể chỉnh sửa tệp / etc / aliases (và sau đó chạy lệnh newaliases) để gửi thư đến địa chỉ không có trên hộp.

Ex of cron entry (Bạn sẽ không thể đặt dòng tiêu đề

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

Hoặc bạn có thể nhận tiện ích ifne - Đây có thể là những gì bạn muốn

dòng grep / var / log / file | ifne mail -s Đăng nhập email@domain.tld

Lệnh ifne có sẵn từ repo epel cho centos và RHEL. Tôi không thể tìm thấy một liên kết đến trang người đàn ông trực tuyến nhưng nó ở đó

ifne (1)
ifne (1)

NAME ifne - Chạy lệnh nếu đầu vào tiêu chuẩn không trống

Lệnh SYNOPSIS ifne [-n]

MÔ TẢ ifne chạy lệnh sau nếu và chỉ khi đầu vào tiêu chuẩn không trống.

TÙY CHỌN -n Hoạt động ngược lại. Chạy lệnh nếu đầu vào tiêu chuẩn là tập đoàn.

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

VÍ DỤ tìm. tên lõi | ifne mail -s "Tập tin lõi tìm thấy" root

TÁC GIẢ Bản quyền 2008 của Javier Merino

   Licensed under the GNU GPL

                              2008-05-01                           ifne(1)

2
Lưu ý rằng grep sẽ thoát khỏi 0 nếu nó không tạo ra đầu ra, vì vậy bạn có thể làm: output = $ (grep line / var / log / file) && echo "$ output" | mail -s Đăng nhập user@example.com
Sean Reifschneider

Ngoài ra, lệnh được đề xuất của bạn không gửi "$ output" cho lệnh mail. :-)
Sean Reifschneider

Tôi sẽ đề nghị chỉnh sửa câu trả lời để đưa vào giải pháp được đề xuất bởi @Sean Reifschneider
Basil A

FYI ifneđược tìm thấy trong moreutilsgói trong ubfox. Thật không may, gói đó cũng mang lại parallelxung đột với parallellệnh từ parallelgói.
artfulrobot

14

"thư người đàn ông" cho tôi biết rằng đối số -E dừng gửi thư nếu cơ thể trống. làm việc tốt cho tôi

-E

Nếu một tin nhắn gửi đi không chứa bất kỳ văn bản nào trong phần tin nhắn đầu tiên hoặc duy nhất của nó, đừng gửi nó mà hãy loại bỏ nó một cách im lặng, thiết lập hiệu quả biến Skipemptybody khi khởi động chương trình. Điều này rất hữu ích để gửi tin nhắn từ các tập lệnh được bắt đầu bởi cron (8).


3
Trên Ubuntu 12.04, GNU Mailtools 2.1 được cài đặt và tùy chọn "-E" cho "mail" có một tốc ký cho --exec. Nó không chứa tùy chọn "cơ thể trống rỗng".
Mark Stosberg

3
@MarkStosberg: Ubuntu có nhiều gói thay thế cung cấp một lệnh mailhoặc mailx. Các bsd-mailxheirloom-mailxgói cả cung cấp một mailxvới -Etùy chọn được mô tả ở đây.
Smylers

1
Làm việc cho tôi trên 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.