Сравните файлы и выберите более крупный

С ценной помощью от @tarleb (который указал мне правильное направление) мне удалось прийти к такому решению:

  1. Добавить reject_sender_login_mismatch в конец секции smtpd_sender_restrictions;
  2. Поскольку у меня есть virtual_mailbox_domains и virtual_alias_maps, основанные на запросах MySQL, добавить smtpd_sender_login_maps = mysql: /etc/postfix/mysql-virtual_sender-login-maps. cf. Это карты, используемые postfix для того, чтобы убедиться, что email логина отправителя и поле from совпадают;
  3. Создайте /etc/postfix/mysql-virtual_sender-login-maps.cf со следующим содержанием:

    user = emailserveruser
    пароль = sdfjn1234ns
    hosts = 127.0.0.1
    dbname = mailstack
    query = SELECT * FROM (SELECT email FROM `virtual_users` WHERE email = '%s' UNION SELECT destination FROM `virtual_alias` WHERE source = '%s' ) a
    

Как это работает?

Postfix выдаст вам письмо From как %s и исключает получение в результате запроса адреса, совпадающего с адресом, используемым при SMTP-аутентификации.

В этом случае мы сначала делаем запрос к таблице virtual_users, и если оттуда ничего не приходит (то есть нет реального пользователя с таким email), мы делаем запрос к virtual_alias, чтобы получить destination адрес (почтовый ящик реального пользователя), который соответствует потенциальному email псевдониму (наше поле source).

Если совпадений нет, запрос ничего не возвращает, это означает, что: 1) нет такого пользователя с таким email 2) нет такого псевдонима для любого пользователя с таким email -- тогда Postfix выдает почтовому клиенту ошибку Sender address rejected: not owned by user.

0
23.01.2019, 13:44
2 ответа
#!/bin/bash

get_attr() {
    # pass '%f' to $2 to get file name(s) or '%s' to get file size(s)
    find "$1" -maxdepth 1 -type f -printf "$2\n"
}

while read -r file
do
    (( $(get_attr "dir2/$file" '%s') > $(get_attr "dir1/$file" '%s') )) \
        && realpath -e "dir2/$file"
done < <(get_attr dir2 '%f')

Это предполагает, что все файлы в dir2имеют те же имена, что и файлы в dir1, как вы описали выше.

realpathпечатает абсолютный путь к файлу.

Этот скрипт также сравнивает скрытые файлы (файлы, начинающиеся с.).

1
28.01.2020, 02:41
#!/usr/bin/env zsh

zmodload -F zsh/stat b:zstat

for file2 in dir2/*(.); do
    file1="dir1/${file2##*/}"

    if [ -f "$file1" ] &&
       [ "$( zstat +size "$file2" )" -gt "$( zstat +size "$file1" )" ]
    then
        printf '%s is bigger than %s\n' "$file2" "$file1"
    fi
done

Это сценарий оболочки zsh, который использует встроенный -в команде zstatдля переносимого получения размеров файлов.

Сценарий будет перебирать все обычные файлы с не -скрытыми именами в каталоге dir2. Для каждого файла в dir2будет создан соответствующий путь к файлу в dir1. Если файл в dir1существует и является обычным файлом (или символической ссылкой на обычный файл ), сравниваются размеры двух файлов. Если файл в dir2строго больше, выводится короткое сообщение.

Шаблон dir2/*(.)будет соответствовать только не -скрытым именам обычных файлов в каталоге dir2. (.)— это специфический модификаторzsh-для *, который позволяет ему соответствовать только обычным файлам.

Выражение "dir1/${file2##*/}"будет расширено до имени пути, начинающегося с dir1/и затем содержащего значение $file2с удалением всего до и включая последнее /. Это можно изменить на "dir1/$( basename "$file2" )".

2
28.01.2020, 02:41

Теги

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