Проблемы с разрешениями для procmail и скрипта Python - PullRequest
0 голосов
/ 23 октября 2019

Итак, вот мой procmalirc. Сценарий, кажется, запускается как «пользователь» почтового ящика, поэтому сценарий CANT создает блокировки, или очищает, или удаляет сообщения, потому что procmail, кажется, имеет блокировку почтового ящика.

SHELL = /bin/sh
LOGFILE = $HOME/pm.log
LOGABSTRACT = "All"
VERBOSE = "on"


:0
* ^From: .*address.*
* ^Subject:.*su to root.*
{
:0c:
/var/spool/mail/tdproxymail

:0ahi
| /usr/local/tdproxy/MAILSCRIPTS/script.py
}

Я доставляюпочта в почтовый ящик и отправка его в сценарий. Когда я запускаю скрипт python, я перебираю почтовый ящик ... в поисках правильного письма ...

mbox = mailbox.mbox('/var/mail/tdproxymail')

for key, msg in mbox.iteritems():
    print(key)
    if "su to root" not in (msg['subject']):
        continue

Все работает нормально, но когда я получаю

mbox.remove(key)
mbox.flush()
mbox.close()

, этоговоря, что у меня нет разрешения на блокировку от procmail, я думаю ...

Тема: su для root Папка: /usr/local/tdproxy/MAILSCRIPTS/edwards_sudo.py 812 Traceback (большинствопоследний вызов последним): Файл "/usr/local/tdproxy/MAILSCRIPTS/script.py", строка 94, в mbox.lock () Файл "/usr/lib64/python2.7/mailbox.py", строка 625, вфайл блокировки _lock_file (self._file) "/usr/lib64/python2.7/mailbox.py", строка 1976, в файле _lock_file pre_lock = _create_tevent (f.name + '.lock') "/ usr / lib64 / python2. 7 / mailbox.py ", строка 2025, в _create_teditional os.getpid ())) Файл" /usr/lib64/python2.7/mailbox.py ", строка 2015, в _create_carefully fd = os.open (путь, os. O_CREAT | os.O_EXCL | os.O_RDWR, 0666) Ошибка OSE: [Errno 13] В доступе отказано: '/var/mail/tdproxymail.lock.1571858501.tdproxy.91248'

Я хотел попробоватьдля обработки электронной почты просто sys.stdin, но я попробовал оба:

#msg = email.message_from_file(sys.stdin)
#msg = email.parser.Parser().parse(sys.stdin)

, и он говорит, что is_multipart является ложным, что я знаю, это не правильный случай ... так что, если я получаю доступ к почтовому ящику, он говоритесть вложение, но если я использую stdin канала, якобы нет вложения

ВОПРОС

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

1 Ответ

0 голосов
/ 23 октября 2019

У вас неправильное имя файла. /var/mail/tdproxymail.1571851019.tdproxy.81261 - это не файл, который существует или к которому у вас должны быть какие-либо разрешения. Ваше имя файла mbox /var/mail/tdproxymail, а отдельные сообщения - это фрагменты в этом файле.

(Вот так работает mbox; другие папки имеют разную структуру, и на самом деле 1571851019.tdproxy.81261 выглядит примерно так, как отдельный файл сообщения вПапка папки maildir может выглядеть следующим образом.)

Цикл по всему почтовому ящику в поисках последнего сообщения в любом случае совершенно сумасшедший. Принятие сообщения на стандартном вводе - это, безусловно, , более разумный, надежный и эффективный подход, поэтому я бы вместо этого рассмотрел, что можно сделать, чтобы это исправить (возможно, что-то простое; но, вероятно, лучше всего опубликовать его как отдельныйвопрос). Если вы не можете решить эту проблему, лучшим быстрым и грязным - но все же довольно отчаянным - обходным решением может быть запись сообщения в отдельный временный файл и передача его в Python.

Просто, чтобы быть явным,гипотеза о том, что это связано с блокировкой почтового ящика, кажется ложной. Блокировка mbox происходит другими способами, а не файлом блокировки на большинстве архитектур (обычно flock или fcntl; но проверьте вывод procmail -v, чтобы увидеть поведение компилируемого в вашей системе) - именно потому, что обычные пользователи этого не делают. У него нет разрешения на создание новых файлов в каталоге, в котором они находятся.

Вероятно Код Python mailbox пытается скопировать файл mbox в другое место, поскольку манипулирует им впамять, как правило, не очень хорошая идея (хотя в данном конкретном случае это может сработать; но опять же, действительно, не делайте этого). Я не пробовал этот код;но типичное расположение библиотечных функций состоит в том, чтобы проверить, установлено ли os.environ['TMPDIR'], и, если да, использовать это для временных файлов.

Но на самом деле, я предполагаю, что основная причина вашей проблемы заключается в том, что вы добавилиh флаг к рецепту, который пишет в Python. Конечно, тогда вы не получите многочастное сообщение;вы вообще не получаете тела, потому что вы сказали Procmail, что вы должны указывать только заголовки для вашего скрипта.

Кроме того, пробелы вокруг знаков равенства являются ошибками синтаксиса. Procmail, как и оболочка, требует, чтобы назначения имели форму variable=string или variable="quoted string" без пробелов по обе стороны от символа =.

# Fix incorrect assignment syntax, no spaces around =
SHELL=/bin/sh
LOGFILE=$HOME/pm.log
LOGABSTRACT="All"
VERBOSE="on"

# Drop the h flag and then also the copying and the a flag
# Also, trailing wildcard is unnecessary in regexes; Procmail matches on any substring
:0i
* ^From: .*address
* ^Subject:.*su to root
| /usr/local/tdproxy/MAILSCRIPTS/script.py

Если вы отчаянно хотите сохранить сообщениесначала в файл, запишите его в каталог типа /tmp/ и запишите имя файла из переменной LASTFOLDER Procmail. Но с исправлением, чтобы удалить флаг h, я надеюсь, что это будет ненужным.

(Вам, конечно, все равно нужно будет удалить код, чтобы попытаться манипулировать файлом mbox из Python, и просто принятьсообщение на стандартный ввод.)

...