Назад | Перейти на главную страницу

очередь sendmail - отображать количество сообщений на домен

Есть ли простая команда, чтобы узнать текущее количество сообщений на домен в очереди sendmail linux? mailq выводит подробный список, но это неудобно для быстрого обзора.

Я использую Centos и sendmail.

mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c
But the above command output is as following:
1 domain.com>

Вышеупомянутая команда не выполнила мое требование, пожалуйста, любая помощь в этом отношении.

Вот обновленный вывод:

domain.com> has 5 message(s)
domain.com.pk> has 1 message(s)
abc.com.pk> has 2 message(s)
xyz.coinfo.net.cn> has 1 message(s)
mmm.com> has 1 message(s)

Попробуй это:

# mailq -v | awk 'BEGIN { FS = "@" } \
!/^[a-zA-Z0-9-]|^[ \t]+(\(|\/|Total requests:)/ { print $2 }' | sort | uniq -c

Что ж, если вы собираетесь использовать perl, то можете пойти до конца.

Ниже приведен довольно несовершенный способ подсчета количества сообщений на домен:

#!/usr/bin/perl

use strict;

my @mailq = `cat /home/users/rilindo/mailq`; #Had to simulate the output of the mail command here. Change this to the actual mailq path, e.g. /usr/bin/mailq
my %domains = ();

foreach my $m (@mailq) {
    $m =~ s/^\s+//;
    $m =~ s/\s+$//;
    $m =~ s/>//;
    next if $m =~ /Queue/;
    if ($m =~ /\d\d:\d\d:\d\d/) {
        $domains{(split(/@/,$m))[1]}++;
    }
    else {
        $domains{(split(/@/,$m))[1]}++;
    }
}

foreach my $d (keys %domains) {
    print $d . " has $domains{$d} message(s)" . "\n";
}

По сути, мы отправляем вывод команды mailq в массив и выполняем итерацию. Для каждой записи в массиве мы удаляем начальные и конечные пробелы / новые строки, а затем разделяем их знаком «@». Затем мы вставляем домен в качестве ключа (если он не существует), а затем увеличиваем его в хэше. При следующей попытке он просто увеличит значение, если был найден тот же домен. Оттуда мы перебираем хэш и затем распечатываем домен с общим количеством совпадений.

Результат:

[rilindo@localhost ~]$ ./parsemail.pl 
domain.com has 6 message(s)
domain3.com has 2 message(s)
domain1.com has 2 message(s)

Как я уже сказал, это не идеально, но работает. По крайней мере, это даст вам представление о том, куда двигаться дальше.

Между прочим, поскольку, похоже, вы знаете Perl, обзор хэш-структур данных Perl окажется очень полезным:

http://www.cs.mcgill.ca/~abatko/computers/programming/perl/howto/hash/

Или:

http://perldoc.perl.org/perldsc.html

«простой» относительный. Анализировать вывод mailq очень сложно, но это можно сделать. Типичный mailq подробный вывод выглядит примерно так:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
637F5CFF9C*    1497 Sat Dec 18 21:40:34  sender@domain.com 
                                         recepient@domain.com

637F5CFF9d*    1497 Sat Dec 18 21:40:35  sender@domain.com 
                                         recepient@domain2.com

Некоторые творческие хакеры могут дать вам то, что вам нужно:

Во-первых, вы хотите убрать эту верхнюю строку - это полезно для человека, но не имеет отношения к нашим целям анализа.
Самый простой способ: mailq -v | egrep -v '^-'

Теперь вы хотите получить информацию о получателе и извлечь доменное имя. Perl здесь ваш друг - передавайте вывод через этот удобный скрипт (назовем его get_domains.pl):

#!/usr/bin/perl
$/ = "\n\n";                                    # Use a blank line as the separator.
while (<>) {
        ($x,$recip) = split(/\n/, $_);          # Extract the recipient line
        ($user,$domain) = split(/@/, $recip);   # Get the domain.
        print "$domain\n";                      # Print Recipient Domain
}

Остается только простая часть - подсчет доменов ( sort | uniq -c).

Так mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c даст вам что-то вроде:

    1 domain.com
    1 domain2.com