Как я могу ограничить исходящие соединения одной программой?

В perl:

#! /usr/bin/perl

use strict;
my %mergecol = ();

while(<>) {
  s/#.*//;            # strip comments
  next if (m/^\s*$/); # skip empty lines
  chomp;
  my ($val,$key) = split ',';
  push @{ $mergecol{$key} }, $val;
};

foreach my $k (keys %mergecol) { 
  printf "%s,%s\n", $k, join('-', @{ $mergecol{$k} } );
}

Цикл while читает входные данные и создает структуру Hash-of-Arrays (HoA) - ассоциативный массив, где каждый элемент является массивом (он же "список"). Ключами хэша являются вторые поля, а элементами каждого списка - первые поля строк с тем же вторым полем.

В конце скрипта распечатывается HoA по одной строке на запись, с именем ключа, запятой, а затем элементы, соединенные -.

выполнить как:

$ ./rock.pl rock.txt
254341,gcmj7krrx5x6nf8r
254333,ysezaratlycpuggl-gqjp2rsjmk1a2v9c-twdzyi2ddbnrfknd-tpqorqbyrg1nmm7s
254344,hguvgstqxu3gowfg
254343,pw1jc5ssyt6hx618-pht92h4adr3mrbz3-alnac47rt8d4ege3

Или сократить и вставить в команду оболочки или сценарий как "однострочный текст":

$ perl -n -e '
    s/#.*//;
    next if (m/^\s*$/);
    chomp; ($v,$k)=split ","; push @{ $mc{$k} }, $v;
    END {
     foreach $k (keys %mc) { printf "%s,%s\n", $k, join("-",@{$mc{$k}}) }
    }' rock.txt 

Или

$ perl -e 'while(<>) {s/#.*//;next if (m/^\s*$/);chomp;($v,$k)=split ",";push @{$mc{$k}}, $v};
    foreach $k (keys %mc) {printf "%s,%s\n",$k,join("-",@{$mc{$k}})}' rock.txt

Обратите внимание, что хэш или ассоциативный массив по своей природе неупорядочен, если вам нужен отсортированный вывод, либо передайте в sort, либо используйте (sort keys %f) в строках foreach my $k выше.

3
06.12.2016, 19:02
1 ответ

(1) Самый простой способ определить Postfix - это, вероятно, iptables --owner --uid-owner postfix match, чтобы указать пользователя Postfix. Вы также можете запустить Postfix в его собственном сетевом пространстве имен или cgroup, подобно решениям в Блокировать сетевой доступ процесса? (и разрешить только этому пространству имен или cgroup отправлять SMTP-трафик).

(2) Сценарий, запускающий sendmail, уже имеет аутентификацию: он выполняется от имени пользователя вашей системы. Существует множество вещей, которые используют этот интерфейс. Cron - один из них, но также и куча случайных скриптов - практически все в системе, отправляющей электронную почту, использует его. Даже установленные MUA (mutt и т.д.) часто используют его по умолчанию.

Предположительно, вы можете заблокировать его только для определенных пользователей, либо используя разрешения файловой системы (сделать его исполняемым только для определенной группы или определенных пользователей с помощью ACL), либо, возможно, конфигурацию Postfix (хотя лично я использую Exim, поэтому не уверен, как это сделать).

1
27.01.2020, 21:30

Теги

Похожие вопросы