繁体   English   中英

procmail 和 python 脚本存在权限问题

[英]Having permissions issues with procmail and python script

所以这是我的procalirc。 该脚本似乎以邮箱的“用户”身份运行,因此该脚本无法创建锁或刷新或删除消息,因为 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 脚本时,我会遍历邮箱...寻找正确的 email...

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 到根文件夹:/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 _lock_file(self._file) 文件“/usr/lib64/python2.7/mailbox.py”,第 1976 行,在_lock_file pre_lock = _create_temporary(f.name + '.lock') 文件“/usr/lib64/python2.7/mailbox.py”,第 2025 行,在 _create_temporary os.getpid())) 文件“/usr/lib64/python2 .7/mailbox.py",第 2015 行,在 _create_carefully fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDWR, 0666) OSError: [Errno 13] Permission denied: '/var/mail/ tdproxymail.lock.1571858501.tdproxy.91248'

我想尝试处理 email 只是 sys.stdin 但我都尝试了:

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

它说 is_multipart 是假的,我知道这不是正确的情况......所以简而言之,如果我访问邮箱,它说有一个附件,但如果我使用 pipe 的标准输入,则应该没有附件

问题

我如何处理然后从邮箱中删除 email,因为在以传入邮件的用户身份运行脚本时似乎存在权限问题。

您的文件名不正确。 /var/mail/tdproxymail.1571851019.tdproxy.81261不是一个存在或您应该有权访问的文件。 您的 mbox 文件名是/var/mail/tdproxymail并且单个消息是该文件中的切片。

(这就是 mbox 的工作原理;其他文件夹具有不同的结构,实际上1571851019.tdproxy.81261看起来有点像 maildir 文件夹目录中单个消息文件的样子。)

遍历整个邮箱以查找最新消息无论如何都是完全疯狂的。 接受标准输入上的消息是迄今为止更明智、更健壮和更有效的方法,所以我会改为探索你可以做些什么来解决这个问题(可能是一些简单的事情;但也可能最好作为一个单独的问题发布)。 如果你不能解决这个问题,一个更好的快速和肮脏的 - 但仍然非常绝望 - 解决方法可能是将消息写入一个单独的临时文件,并将其传递给 Python。

明确地说,这与邮箱锁定有关的假设似乎是错误的。 在大多数体系结构上,锁定 mbox 的方式不是锁定文件(通常是flockfcntl ;但请检查procmail -v的 output 以查看系统上的编译行为) - 正是因为普通用户没有权限在收件箱所在的目录中创建新文件。

可能Python mailbox代码试图将mbox文件复制到不同的位置,因为在 memory 中操作它通常不是一个好主意(尽管在这种特殊情况下它可能会起作用;但同样,真的,不要那样做)。 我没有尝试过该代码; 但一个典型的安排是库函数检查是否设置了os.environ['TMPDIR'] ,如果设置了,则将其用于临时文件。

但事实上,我猜你问题的根本原因是你将h标志添加到写入 Python 的配方中。 当然,那时您不会收到多部分消息; 您根本没有正文,因为您告诉 Procmail 只将标题提供给您的脚本。

顺便说一句,等号周围的空格是语法错误。 Procmail 和 shell 一样,要求赋值的形式为variable=stringvariable="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/之类的目录,然后从 Procmail 的LASTFOLDER变量中捕获文件名。 但是通过修复删除h标志,我相信这将是不必要的。

(当然,您仍然需要删除代码以尝试从 Python 操作mbox文件,并且只需接受标准输入上的消息。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM