Я полагаю, что ssh в это время съедает остаток на stdin. Вы можете обратиться к FAQ 89 Bash для подробностей. При использовании FileDescriptor следующие коды должны работать, как вы ожидаете.
while read line <& 7
do
sshpass -p password ssh root@$line << EOF
hostname
uname -r
EOF
done 7< server.txt
С любезной помощью Benoît Panizzon из списка рассылки MIMEDefang я обнаружил, что мне нужно использовать inet
вместо unix
в качестве прослушивающего сокета, чтобы он прослушивал порт TCP на указанном локальном или удаленном хозяин. Таким образом, процедура установки MIMEDefang в Debian/Ubuntu:
apt install mimedefang
/etc/default/mimedefang
установите (используйте другой порт, если хотите):SOCKET=inet:33333
/etc/postfic/main.cf
:
smtpd_milters = inet:localhost:33333
milter_default_action = accept
/etc/mimedefang-filter
в /etc/mail/mimedefang-filter
и измените его в соответствии с вашими потребностями (не нужно делать его исполняемым ). sudo systemctl reload postfix mimedefang
MIMEDefang необходимо перезагружать при каждом изменении mimedefang-filter
.
Кстати, эта презентация дает хорошее представление о MIMEDefang:https://www.mimedefang.org/static/mimedefang-lisa04.pdf
Фактически выполняемый Perl-скрипт находится в /usr/bin/mimedefang.pl
, который затем включает mimedefang-filter
.
Я также хотел написать свою логику фильтрации на PHP вместо Perl, поэтому я придумал следующее решение. Добавьте это в конец, например. функция filter_begin
вmimedefang-filter
:
%passToPhp = ("Sender", $Sender, "Recipients", \@Recipients, "Subject", $Subject, "RelayAddr", $RelayAddr, "RelayHostname", $RelayHostname, "Helo", $Helo, "QueueID", $QueueID, "MessageID", $MessageID);
my $cmd = "/path/to/your/email-filter.php";
$cmd.= " ". encode_base64(encode_json(\%passToPhp), '');
my $phpOutput = `$cmd`;
md_syslog('info', "PHP filter output: $phpOutput"); #causes entry in /var/log/mail.log
if ($phpOutput eq "bounce") {
action_bounce("We dont want this particular message.");
} elsif ($phpOutput eq "discard") {
action_discard();
}
Затем используйте следующий код в email-filter.php
, чтобы начать работу:
#!/usr/bin/php
<?php
// runs as user "defang". This file must have execute permissions.
// Get variables from mimedefang that we passed along, headers, raw message, and extra information from mimedefang
$arguments = ($argv[1] ? base64_decode($argv[1]) : null);
if ($arguments) $arguments = json_decode($arguments, true);
$headers = file_get_contents('HEADERS');
$raw_message = file_get_contents('INPUTMSG');
$commands = file_get_contents('COMMANDS');
// Get all the MIME parts into an array
$mimeparts = [];
chdir('./Work');
foreach (glob('*') as $mimepart_file) {
if (is_dir($file)) continue;
$mimeparts[$mimepart_file] = file_get_contents($mimepart_file);
}
// Do all your logic here...
if ($someLogic == 'spam') {
echo 'discard';
// echo 'bounce'; //use this line if you want to have a bounce message sent back to sender (but you probably don't want that for spam)
}
Контролируйте /var/log/mail.log
, чтобы убедиться, что все работает должным образом.