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