이 procmail 필터링을 약간 정리할 수 있습니까?

이 procmail 필터링을 약간 정리할 수 있습니까?

나는 작동하는 것처럼 보이지만 실제로는 자랑스럽지 않은 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/

이해하셨겠지만, 저는 clamdscan 결과에 따라 이메일 헤더에 태그를 지정하고 양성인 경우 $MAILDIR /.virus/에 배치하려고 X-ClamAV: Yes, $MATCH합니다 . X-ClamAV: Virus Free그게 다야.

편집하다:

어쩌면 이것이 더 나을 수도 있습니다:

: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:

@tripleee가 제안한 것과 동일한 EDIT2에서 시도한 솔루션이 좋았습니다. 문제는 args를 읽지 못한 필터에 관한 것입니다.

나는 교체했다

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

~에 의해

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

그리고 지금은 괜찮은 것 같아요.

답변1

빠른 스타일 참고로 여기서는 중괄호가 필요하지 않습니다.

: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/

관련 정보