Есть ли простая команда, чтобы узнать текущее количество сообщений на домен в очереди 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/
Или:
«простой» относительный. Анализировать вывод 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