AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1146433
Accepted
Chris972
Chris972
Asked: 2023-10-24 04:07:18 +0800 CST2023-10-24 04:07:18 +0800 CST 2023-10-24 04:07:18 +0800 CST

是否可以稍微清理一下这个 procmail 过滤

  • 772

我有这个 procmail 过滤器,它似乎可以工作,但我并不为此感到自豪。我相信我们可以使用嵌套部分进行更多优化和清理,但我无法实现任何功能结果。

:0
* !^X-ClamAV
VIRUS=|/usr/bin/clamdscan --no-summary --stdout -

:0fw
* !^X-ClamAV
* VIRUS ?? .*: \/.* FOUND
| formail -a "X-ClamAV: Yes, $MATCH"
:0Efw
* !^X-ClamAV
| formail -a "X-ClamAV: Virus Free"

:0
* ^X-ClamAV: Yes
$MAILDIR/.virus/

您可能已经理解,我尝试使用X-ClamAV: Yes, $MATCH或X-ClamAV: Virus Free根据 clamdscan 结果标记电子邮件标头,并将其放入 $MAILDIR /.virus/ 如果是肯定的。就这样。

编辑:

可能这样更好:

:0
* !^X-Virus-Status
VIRUS=|/usr/bin/clamdscan --no-summary --stdout -

:0
* !^X-Virus-Status
* VIRUS ?? .*: \/.* FOUND
{
        :0fhw
        | formail -a "X-Virus-Status: Infected, $MATCH"
}
:0Efw
| formail -a "X-Virus-Status: Virus Free"

:0
* ^X-Virus-Status: Infected
$MAILDIR/.virus/

(我更改了标签以便能够使用 clamav-filter 中的 AddHeader 进行过滤)

编辑2:

但我犯了一个错误,没有解释清楚,或者根本没有解释,事实上,电子邮件可以在 procmail (clamav-milter) 之前标记,因此已经包含X-Virus-Status: Infected. 在这种情况下,重复扫描是没有意义的,但您必须将电子邮件放入.virus. 这就是为什么我需要放

:0
* ^X-Virus-Status: Infected
$MAILDIR/.virus/

脱离大括号

但我的解决方案似乎不太好(procmail: Skipped "--no-summary --stdout -"):

:0
* !^X-Virus-Status
{
        VIRUS=|/usr/bin/clamdscan --no-summary --stdout -

        :0
        * VIRUS ?? .*: \/.* FOUND
        {
                VIRUSNAME=`echo "$MATCH" | sed 's/ FOUND$//'`
                :0fhw
                | formail -a "X-Virus-Status: Infected ($VIRUSNAME)"
        }
        :0Efw
        | formail -a "X-Virus-Status: Virus Free"
}

:0
* ^X-Virus-Status: Infected
$MAILDIR/.virus/

我不想覆盖X-Virus-Status.

  • .virus如果未标记 -> 扫描 -> 标记(是否感染) ->如果感染则放入
  • .virus如果已经标记 ->如果被感染则放入

换句话说(也许更清楚):

1) tagged X-Virus-Status?
    yes:    go 2)
    no: scan -> infected?
                yes: tag infected
                no: tag non infected
2) tagged X-Virus-Status: Infected?
    yes: put in .virus
    no: go 3)
3) continue procmail filters

编辑3:

我在 EDIT2 中尝试的解决方案与@tripleee 提出的相同,效果很好。问题在于未读取参数的过滤器。

我更换了

VIRUS=|/usr/bin/clamdscan --no-summary --stdout -

经过

VIRUS=`/usr/bin/clamdscan --no-summary --stdout -`

现在好像没问题了。

clamav
  • 1 1 个回答
  • 62 Views

1 个回答

  • Voted
  1. Best Answer
    tripleee
    2023-10-24T17:36:37+08:002023-10-24T17:36:37+08:00

    作为一个快速的风格说明,这里不需要大括号。

    :0fhw
    * !^X-Virus-Status
    * VIRUS ?? .*: \/.* FOUND
    | formail -a "X-Virus-Status: Infected, $MATCH"
    

    这些fhw标志适用于操作,并且仅在条件匹配时才会执行。

    另一方面,当这些条件成立时,我可能会在您想要采取的所有操作周围使用一组大括号。

    作为修复语法错误的替代方法,请尝试在 VIRUS 赋值周围使用反引号。也可以使用=|赋值语法,但如果第一个语法不适合您,请尝试另一个。我在这里工作得很好。

    :0
    * !^X-Virus-Status
    { VIRUS=`clamdscan --no-summary --stdout -` }
    
    :0
    * !^X-Virus-Status
    * VIRUS ?? .*: \/.* FOUND
    {
        :0fhw
        | formail -a "X-Virus-Status: Infected, $MATCH"
    
        :0
        $MAILDIR/.virus/
    }
    :0Efw
    | formail -a "X-Virus-Status: Virus Free"
    

    MATCH也许在将最后一个“FOUND”标记写入标头之前将其删除也很有用。

    :0
    * !^X-Virus-Status
    * VIRUS ?? .*: \/.* FOUND
    {
        VIRUSNAME=`echo "$MATCH" | sed 's/ FOUND$//'`
        :0fhw
        | formail -a "X-Virus-Status: Infected, $VIRUSNAME"
    

    (我正在努力想出一个不需要外部过程来修剪字符串末端的解决方案。也许类似的事情可以通过巧妙地使用评分来完成,但对于这个简单的方法来说,这可能有点过分了。)

    最后,我不确定您是否要覆盖X-Virus-Status即使它已经存在。:0E当其中一个或两个条件都不成立时,您的情况就会发生。也许你的意思是这个;

    :0
    * !^X-Virus-Status
    {
        VIRUS=`clamdscan --no-summary --stdout -`
        
        :0
        * VIRUS ?? .*: \/.* FOUND
        {
            VIRUSNAME=`echo "$MATCH" | sed 's/ FOUND$//'`
            :0fhw
            | formail -a "X-Virus-Status: Infected, $VIRUSNAME"
    
            :0
            $MAILDIR/.virus/
        }
        :0Efw
        | formail -a "X-Virus-Status: Virus Free"
    }
    

    换句话说,仅当X-Virus-Status:标头中尚未存在时才执行这些操作;如果 Clamscan 的结果表明没有病毒,请添加标题“Virus Free”。

    我拿出了/usr/bin;可能比硬编码所有路径更好地确保你的PATH理智,但当然,最终取决于你。

    根据您更新的问题,我想您想要的逻辑是

    :0
    * !^X-Virus-Status
    {
        VIRUS=`clamdscan --no-summary --stdout -`
        
        :0
        * VIRUS ?? .*: \/.* FOUND
        {
            VIRUSNAME=`echo "$MATCH" | sed 's/ FOUND$//'`
            :0fhw
            | formail -a "X-Virus-Status: Infected, $VIRUSNAME"
        }
        :0Efw
        | formail -a "X-Virus-Status: Virus Free"
    }
    
    :0
    * ^X-Virus-Status: Infected
    $MAILDIR/.virus/
    
    • 1

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve