【问题标题】:Having permissions issues with procmail and python scriptprocmail 和 python 脚本存在权限问题
【发布时间】:2019-10-23 17:35:26
【问题描述】:

所以这是我的 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 脚本时,我会遍历邮箱...寻找正确的电子邮件...

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_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'

我想尝试只处理 sys.stdin 的电子邮件 但我都试过了:

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

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

问题

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

【问题讨论】:

    标签: python procmail


    【解决方案1】:

    您的文件名不正确。 /var/mail/tdproxymail.1571851019.tdproxy.81261 不是存在的文件,也不是您应该有任何访问权限的文件。您的 mbox 文件名是 /var/mail/tdproxymail,单个消息是该文件中的切片。

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

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

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

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

    但事实上,我猜你问题的根本原因是你在写入 Python 的配方中添加了 h 标志。当然,那时您不会收到多部分消息;您根本没有正文,因为您告诉 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 文件,并且只需接受标准输入上的消息。)

    【讨论】:

    • 或者您没有向我们展示的 Python 代码尝试创建一个具有该名称的临时文件,但显然缺乏权限?这是有道理的,因为通常不会完全从内存中的 mbox 文件中删除单个消息,即使在这种特定的有限情况下,它可能通过简单地截断原始文件来工作。也许你可以告诉临时文件函数使用一个不同的目录,你确实有写权限。
    • 所以我更新了错误......你可以看到它追溯到python代码中的mbox.lock()......所以它甚至不能写锁定文件...... ..
    • 不,您正在尝试创建一个文件,但它不是锁定文件,可能与我在上一条评论中的猜测完全一致。
    • 不清楚sudo.pymilbox.pyscript.py 有什么关系
    • sudo.py?邮箱.py?只有 1 个脚本.....在用户帐户下运行,但不通过 procmail ...... edwards_sudo.py 是唯一的脚本运行......其他是从使用的 python 库报告的错误。
    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多