LINUX.ORG.RU
ФорумAdmin

“Permission deniend” для content_filter для Постфикса

 


0

1

Создаю content_filter для Постфикса. Есть такой скрипт на питоне:

$ ls -al /home/main_user/test1.py
-rwxr-xr-x 1 vmail2 nobody /home/main_user/test1.py

Вот **/etc/postfix/master.cf**:


smtp      inet  n       -       n       -       -       smtpd 
  -o content_filter=filter1:dummy

# [........................]

filter1    unix  -       n       n       -       10      pipe
    flags=Rq user=vmail2 null_sender=
    argv=/home/main_user/test1.py -f ${sender} ${recipient}

Не работает из-за прав. Вот ошибка в логах.


fatal: pipe_command: execvp /home/main_user/test1.py Permission denied

**vmail2** - пользователь без никто :) Домашней директории нет у него:


$ id vmail2
uid=5002(vmail2) gid=5002(vmail2) groups=5002(vmail2)

Что не так? Почему и как лечить?

Перемещено a1batross из general



Последнее исправление: roman-voran (всего исправлений: 1)

Почему и как лечить?

Почему лечить? Очевидно, потому что не работает.

Директории (по всей иерархии начиная с корня), в которых лежит скрипт, читабельны/проходибельны (r-x) пользователем, от которого запускается скрипт? Я бы положил его в /usr/local/etc/postfix, или где там у тебя конфиги постфикса лежат.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Директории (по всей иерархии начиная с корня), в которых лежит скрипт, читабельны/проходибельны (r-x) пользователем, от которого запускается скрипт?

Может и не проходибельны

Как проверить? И как сделать их проходибельными?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

Для начала покажи что у тебя в скрипте (хотя бы шебанг). Подозреваю, что у тебя его вообще нет.

mord0d ★★★★★
()

usermod -aG vmail2 postfix
chown vmail2:vmail2 /home/main_user/test1.py
chmod +x /home/main_user/test1.py

но вообще нечего этому скрипту делать в /home/main_user/

mv /home/main_user/test1.py /opt/mailscripts

constin ★★★★
()
Ответ на: комментарий от constin

У него нормально всё с правами на скрипт, тут либо нет возможности достучаться до этого скрипта (диры непроходимы), либо шебанга нет или он кривой.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

а причем тут шебанг? если его нет, но скрипт будет исполняться как bash с соответствующим аутлупом «* command not found», но никак не permission denied

constin ★★★★
()
Ответ на: комментарий от constin

если его нет, но скрипт будет исполняться как bash

С какого это перепугу?

с соответствующим аутлупом «* command not found», но никак не permission denied

Попробуй для начала.

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Вот только Postfix вряд ли скармливает пайпы в баш.

А что ему еще делать? Он никак не может сам опознать интерпритатор и запускает скрипт операционкой, те как показано в моем примере.

constin ★★★★
()
Ответ на: комментарий от constin

Он никак не может сам опознать интерпритатор

Для этого есть шебанг.

запускает скрипт операционкой

А чем ещё он запускает?

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Для этого есть шебанг.

Это вы предположили , что его там нет. Я написал, что при его отсутствии был бы другой вывод и доказал.

еще можно в master.cf написать python script_name

Но это уводит нас от проблемы автора поста, которая, в общем, и не проблема вовсе.

constin ★★★★
()
Ответ на: комментарий от constin

Заработало.

Другой вопрос. В скрипт можно отправить переменные окружения, которые передаются от Postfix'a. у меня передаются 2 шт:

${sender} и ${recipient}

1) Как отправить сразу все, которые передает Postfix?

----

2) Как в самом скрипте получить к ним доступ? Где передается самый 1ый аргумент *в данном случае* — argv[0]? Или в argv[1]? Или в argv[2]?

Я видел где-то в интернете, что это в похожем скрипте это был argv[2]. Но, почему [2], а не [1] или [0]?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

3) скрипт на питоне просто отправляет мне мыло через localhost. в логах всё хорошо, ошибок нет. Пишет, что мылы отправлены успешно. или в queue - непонятно.

Но, я этих мыл не вижу у себя на компе. Мне кажется, что они попадают в очередь и там остаются почему-то. Когда удалил фильтр и сказал «sudo postsuper -r ALL», все эти мылы пришли.

Почему?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

То есть, рекомендуется скрипты для Постфикса складывать в /opt?

рекомендуется все самописные пакеты ставить в /opt, но можно бинарник и в /usr/bin положить.

Как отправить сразу все, которые передает Postfix?

Все сразу? думаю нет, но можно перечислить необходимое

вот тут , начиная с argv=command.. полный список того, что можно послать.

http://www.postfix.org/pipe.8.html

Как в самом скрипте получить к ним доступ?

точно тоже самое, что вы запускаете скрипт в терминале и в stdin загоняете ему параметры. argv[0] - имя файла скрипта, далее пошли уже аргументы команды.

обрабатывать можно, как забирая просто агрументы, так и через суффиксы( вон у вас там, например, -f ${sender} ) -f написано.

constin ★★★★
()
Ответ на: комментарий от roman-voran

Но, я этих мыл не вижу у себя на компе. Мне кажется, что они попадают в очередь и там остаются почему-то. Когда удалил фильтр и сказал «sudo postsuper -r ALL», все эти мылы пришли.

значит скрипт плохо отрабатывает и не дает ответа.

postqueue -p что пишет?

constin ★★★★
()
Ответ на: комментарий от mord0d

Вот только Postfix вряд ли скармливает пайпы в баш.

The command is executed directly, i.e. with-out interpretation of shell meta characters by a shell command interpreter.

constin ★★★★
()
Ответ на: комментарий от mord0d

Что и требовалось доказать.

это вообще не то, что вам «требовалось доказать». я скопипастил случайно не тот кусок, этот текст говорит лишь о том, что при запуске команды postfix не будет как-то специально обрабатывать ваши && || . и прочие спец символы.

constin ★★★★
()
Ответ на: комментарий от mord0d

С шизофренией проследуйте в Talks.

да ты просто смешно облажался тут пару раз и не хочешь признать, твое дело.

constin ★★★★
()
Ответ на: комментарий от constin

Пару сообщений там есть, которые должны были бы прийти

$ sudo postqueue -p
-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
879E42094A*    1003 Wed Oct 23 16:11:51  i@my_domain.com
                                         i@my_domain.com

68E1B20948*    1003 Wed Oct 23 16:11:51  i@my_domain.com
                                         i@my_domain.com


Почему они там?

Мой скрип ничего не возращает в вызывающий его код - Постфиксу. Он просто отправляет мыло, но явно ничего не возращает. Это причина? Что должен возвращать?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

content_filter должен отдавать письмо постфиксу назад: либо локально либо через левый порт, на котором нет ограничений.

можно увидеть логи и скрипт?

constin ★★★★
()
Ответ на: комментарий от constin

Как отдавать? «Здравствуйте, я - питон-почтальон, вот вам ваше письмо назад?»

Логи - там success и sent

Скрипт - нагугли любой скрипт на питоне, который отправляет мыло.

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

примерно такие

Aug 31 15:53:54 mail postfix/qmgr[3781]: 044944242D: from=<yyyy@yyyy.com>, size=1947, nrcpt=1 (queue active)
Aug 31 15:53:54 mail postfix/smtp[3799]: 84D3D42428: to=<xxxx@xxxx.com>, relay=localhost[127.0.0.1]:10026, delay=1, delays=0.55/0.01/0.04/0.4, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 044944242D)
Aug 31 15:53:54 mail postfix/smtpd[3800]: disconnect from localhost[127.0.0.1]
Aug 31 15:53:54 mail postfix/qmgr[3781]: 84D3D42428: removed
Aug 31 15:53:54 mail postfix/virtual[3802]: 044944242D: to=<xxxx@pxxxx.com>, relay=virtual, delay=0.49, delays=0.4/0.05/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)

postfix email-server perl
roman-voran
() автор топика
Ответ на: комментарий от roman-voran

лог

localhost postfix/smtpd[14393]: connect from localhost[127.0.0.1]
localhost postfix/smtpd[14393]: 3BBAF20947: client=localhost[127.0.0.1]
localhost postfix/cleanup[14397]: 3BBAF20947: info: header To: me@domain1.com from localhost[127.0.0.1]; from=<mememe@domain2.com> to=<me@domain1.com> proto=ESMTP helo=<[127.0.0.1]>
localhost postfix/cleanup[14397]: 3BBAF20947: info: header From: mememe@domain2.com from localhost[127.0.0.1]; from=<mememe@domain2.com> to=<me@domain1.com> proto=ESMTP helo=<[127.0.0.1]>
localhost postfix/cleanup[14397]: 3BBAF20947: info: header Subject: subj33455 from localhost[127.0.0.1]; from=<mememe@domain2.com> to=<me@domain1.com> proto=ESMTP helo=<[127.0.0.1]>
localhost postfix/cleanup[14397]: 3BBAF20947: message-id=<20191025081356.3BBAF20947@mail.my_main_email.com>
localhost postfix/qmgr[13199]: 3BBAF20947: from=<mememe@domain2.com>, size=1001, nrcpt=1 (queue active)
localhost postfix/smtpd[14393]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
localhost postfix/pipe[14293]: 1D26320948: to=<me@domain1.com>, relay=filter1, delay=0.16, delays=0.01/0/0/0.16, dsn=2.0.0, status=sent (delivered via filter1 service)
localhost postfix/qmgr[13199]: 1D26320948: removed
roman-voran
() автор топика
Ответ на: комментарий от constin

Разве тут не будет бесконечного цикла?

Мыло пришло, и в content_filter оправляется новый мыл на другой мыл, но который обслуживается **тем же самым постифксом** на том же самом сервере?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

Разве тут не будет бесконечного цикла?

Будет, если отдавать на 25 порт, на котором весит фильтр.

Поэтому поднимают обычно дополнительно в master.cf 127.0.0.1:10025 ( те он работает только для локалхоста и не светит наружу) или сокет и на нем уже нет ограничений и фильтра

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 2)
Ответ на: комментарий от roman-voran

localhost postfix/pipe[14293]: 1D26320948: to=<me@domain1.com>, relay=filter1, delay=0.16, delays=0.01/0/0/0.16, dsn=2.0.0, status=sent (delivered via filter1 service)

ну да, postfix отдал мыло фильтру и не получил его назад. Обычно ДАЛЕЕ в логах from localhost:10025 бла бла бла status=sent (delivered to docevot)

constin ★★★★
()
Ответ на: комментарий от constin

1. Что значит «отдавать»? Как?

Как и сказал, скрипт ничего не берёт, он просто отправляет новый email

roman-voran
() автор топика
Ответ на: комментарий от constin

что-то я ни хрена не пойму

1. без "-f" во всех агрументах *всегда* адрес получателя

2. с "-f" есть адрес отправителя, но я до него не могу добраться

то есть sys.argv[1] - дает "-f", a sys.argv[2] и sys.argv[3] дают всегда адрес получателя.

до адреса отправителя ни хрена не могу добраться

что за "-f", зачем она вообще?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

f ты САМ написал в команде. Значит ТВОЙ скрипт должен ее как-то отрабатывать.

Тут нет никакой магии. Есть скрипт, который в stdin принимает аргумерты, есть команда в конфига постфикса. Как пропишешь команду, так и будет. Это все вообще никак и ничем не отличается от того, как если бы ты просто запустил свой скприт в терминале типа ./test.py lala1 lala2 lala3. Так что можешь прямо так и тестировать.

constin ★★★★
()
Ответ на: комментарий от constin

Ок

3-ий раз спрашиваю «что значит отдавать письмо обратно постфиксу и как»? Где об этом говорится в документации?

roman-voran
() автор топика
Ответ на: комментарий от roman-voran

3-ий раз спрашиваю

Мне кажется, что вы взялись за непосильную для ваших знаний задачу.

Научитесь хотя бы гуглить.

Вот пример на баше:

https://www.linuxtopia.org/online_books/mail_systems/postfix_documentation/FI...

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 2)
Ответ на: комментарий от roman-voran

Ещё раз говорю, что там нет какого-то API или сложностей. Вы отдаете так же как посылали бы письмо с командной строки. И принимаете, в общем, так же. Все просто до безобразия.

constin ★★★★
()
Ответ на: комментарий от roman-voran

Надо браться за трудные, а не непосильные. Непосильную вы не сделаете и она у вас ещё и желание отобъет.

На этом я с вами прощаюсь.

constin ★★★★
()
Ответ на: комментарий от roman-voran

ну куда же вы, куда???

подальше от stackoverflow админов/кодеров, которые садятся бесплатно на шею, вместо того, чтобы думать.

constin ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.