Sieve 스크립트에서 Bash 스크립트 호출

Sieve 스크립트에서 Bash 스크립트 호출

혹시 비슷한 질문을 하신 분이 계신지 모르겠네요.
현재 이메일이 스팸 폴더 안팎으로 이동될 때 스팸/햄으로 인식할 수 있도록 이메일을 스팸 필터에 푸시하려고 합니다. 이를 위해 나는 다음 가이드를 따랐습니다.https://workaround.org/ispmail/stretch/filtering-out-spam-with-rspamd"사용자 작업을 통해 학습" 섹션에서.
sieve 스크립트는 지침에 따라 생성되었으며 sievec에서 처리되었으며 지침에 따라 권한이 부여되었습니다. 이에 따라 두 개의 쉘 스크립트도 생성되었습니다. 유일한 차이점은 사용자 또는 그룹 "vmail"이 없다는 것입니다. 나는 그것을 우리 시스템의 대응물인 dovecot:root로 설정했습니다. 폴더는 다음과 같습니다.

drwxr-xr-x 2 dovecot root 4,0K Mai  7 10:52 .
drwxr-xr-x 3 root    root 4,0K Jul 29  2019 ..
-rw-r--r-- 1 dovecot root   85 Mai  7 10:47 learn-ham.sieve
-rw-r--r-- 1 root    root  246 Mai  7 10:47 learn-ham.svbin
-rw-r--r-- 1 dovecot root   86 Mai  7 10:47 learn-spam.sieve
-rw-r--r-- 1 root    root  250 Mai  7 10:47 learn-spam.svbin
-rw-r--r-- 1 dovecot root  509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 root    root  398 Mai  6 18:02 mailfilter.svbin
-rwx------ 1 dovecot root   41 Mai  7 10:52 rspamd-learn-ham.sh
-rwx------ 1 dovecot root   42 Dez 14 10:42 rspamd-learn-spam.sh

시브 스크립트가 실행되어 셸 스크립트를 호출해야 하면 다음 오류가 발생합니다.

Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-12 17:16:28]
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: sieve: left message in mailbox 'Junk'
Mai 12 17:16:28 mail dovecot[4119]: imap(user)<8778><xIGQ8nSlFMZ/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

"서버 로그"가 무엇을 의미하는지 전혀 모른다는 것 외에는 문제가 무엇인지 알 수 없습니다. 물론, 이는 권한 오류처럼 보이지만 어떻게 해결할 수 있을까요?

시스템 정보: Dovecot 2.3.4.1 및 piginghole 0.5.4가 포함된 Debian 10.4
편집하다:
실수를 발견했습니다. sieve_pipe_bin_dir을 잘못된 폴더에 설정했습니다. 이제 두 개의 .sh 파일이 포함된 폴더를 가리키지만 여전히 다음 오류가 발생합니다.

Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Fatal: execvp(/etc/dovecot/sieve/global/rspamd-learn-spam.sh) failed: Permission denied
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: write(program stdin) failed: Broken pipe
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: program `/etc/dovecot/sieve/global/rspamd-learn-spam.sh' terminated with non-zero exit code 84
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: pipe action: failed to pipe message to program `rspamd-learn-spam.sh': refer to server log for more information. [2020-05-22 15:40:06]
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: sieve: left message in mailbox 'Junk'
Mai 22 15:40:06 mail dovecot[18547]: imap(user)<18686><57dcxDymXJ5/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

어떤 소유자를 설정하든(root:root 또는 dovecot:root, "인간 사용자"가 아닌 유일한 다른 사용자는 _apt, bin, nslcd, daemon, dovenull 또는 www-data와 같습니다) 원인이 될 수 있는 모든 아이디어 저것?

편집 2:
이제 접근 방식을 변경하고 rspamc로 직접 파이프하려고 합니다. 내 learn-spam.sieve 스크립트는 다음과 같습니다.

require ["vnd.dovecot.pipe", "copy", "imapsieve"];
pipe :copy "rspamc" ["learn_spam"];

그래서 90-plugin.conf를 다음과 같이 변경했습니다.

sieve_pipe_bin_dir = /usr/bin/rspamc

rspamc의 위치. 이제 오류가 발생합니다.

Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: pipe action: failed to pipe message to program: program `rspamc' not found
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: sieve: left message in mailbox 'Junk'
Jun 03 09:48:34 mail dovecot[1536]: imap(user)<10486><xVI6QSmnpLN/AAAB>: Error: sieve: Execution of script /etc/dovecot/sieve/global/learn-spam.sieve failed

무엇이 잘못되었나요? 아니면 pidgeonhole 파이프라인 명령은 쉘 스크립트만 호출할 수 있습니까?

답변1

작동하지 않는 것을 찾은 것 같습니다. 어떤 이유로 dovecot에는 쉘 스크립트에 대한 실행 권한이 없는 것 같습니다. 그래서 해결책은 실제로 sudo -u dovecot chmod +x *.sh
제 경우의 올바른 파일 권한은 다음과 같습니다.

/etc/dovecot/sieve/global # ls -la
insgesamt 44K
drwxr-xr-x 2 dovecot root 4,0K Jul  8 07:33 .
drwxr-xr-x 3 root    root 4,0K Jul 29  2019 ..
-rw-r--r-- 1 dovecot root  144 Jun  5 10:06 learn-ham.sieve
-rw-r--r-- 1 root    root  306 Jun  5 10:07 learn-ham.svbin
-rw-r--r-- 1 dovecot root   86 Jun 17 15:45 learn-spam.sieve
-rw-r--r-- 1 root    root  250 Jun 17 15:45 learn-spam.svbin
-rw-r--r-- 1 dovecot root  509 Mär 16 13:57 mailfilter.sieve
-rw-r--r-- 1 dovecot root  462 Jul 29  2019 mailfilter.sieve~
-rw-r--r-- 1 root    root  398 Mai  6 18:02 mailfilter.svbin
-rwxrwxr-x 1 dovecot root   41 Jun  5 10:25 rspamd-learn-ham.sh
-rwxrwxr-x 1 dovecot root   42 Jul  8 07:33 rspamd-learn-spam.sh

답변2

에서 sieve_pipe_bin_dir설정이 재정의되었는지 확인하세요 . 이 경우 에서 주석 처리를 해제 하거나 에서 제거하고 기본 디렉토리를 사용할 수 있습니다(예:90-plugin.conf90-sieve-extprograms.conf90-sieve-extprograms.conf90-plugin.conf90-plugin.conf/usr/lib/dovecot/sieve-pipe/

sieve_pipe_bin_dir실행 파일의 파일 이름이 아닌 원래 디렉터리 이름과 같은 디렉터리 이름으로 설정해야 합니다.

Permission denied프로그램을 실행한다는 것은 dovecot이 프로그램(실행 파일이나 상위 디렉터리)을 읽거나 실행할 수 있는 권한이 없다는 것을 의미할 수 있습니다. stat $file실행 파일의 권한을 사용하거나 확인할 수 있습니다 ls -l $file. chmod +x $file실행 가능하게 만듭니다(모든 사용자). dovecot이 프로그램을 실행하여 프로그램을 실행할 수 있는지 여부를 테스트해 볼 수 있습니다 sudo -u dovecot $file(이런 방식으로 실행해도 스크립트가 나쁜 작업을 수행하지 않는다고 가정). $file예를 들어/etc/dovecot/sieve/global/rspamd-learn-spam.sh

답변3

참고로 이를 달성하기 위해 수행한 단계는 다음과 같습니다.

  1. 디렉터리(예: mail_processor.py) 에 스크립트를 만듭니다 /usr/lib/dovecot/sieve-execute/.

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • 스크립트와 대상 파일에 올바른 권한이 있는지 확인하세요.

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. 플러그인 활성화 sieve_extprograms:

    • 다음을 사용하여 수정된 \etc\dovecot\conf.d\90-sieve.conf플러그인 섹션:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • 비둘기장을 다시 로드하세요:

      $ service dovecot restart
      
  3. 시브 필터를 만듭니다(예: Roundcube에서 goto settings-> filters-> actions-> edit filter set).

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

이제 이 필터를 사용하여 사서함으로 전달된 모든 메시지는 파이프라인을 통과합니다 mail_processor.py.

Pigeonhole Sieve: Extprograms 플러그인참고로

답변4

일반적인 예를 사용하여 비슷한 문제에 직면했습니다 pipe :copy "dovecot-lda".

첫째: 파이프라인 실행 파일이 어디에 있는지 Doveco에 알려줍니다. 00-zzzzz.conf 파일에서 sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe. 이는 Sieve 스크립트의 "파이프라인" 명령에만 적용됩니다. HyperActive의 대답은 "실행" 명령입니다. dovecot.conf 또는 .conf 파일을 가져올 수 있는 다른 위치에 !include가 있는 한 .conf 파일은 중요하지 않습니다. (90-sieve.conf, 90-sieve-extprograms.conf 등)

둘째: Dovecot을 다시 시작하여 설정이 로드되도록 합니다.

셋째: 폴더를 만듭니다. mkdir /usr/lib/dovecot/sieve-pipe 나는 이것을 루트로하고 있습니다. 다른 사용자가 폴더에 액세스할 수 있도록 하려면 chmod 755를 사용하세요.

넷째: 파이프할 CLI 명령에 대한 실행 파일을 이 폴더에 저장합니다.
dovecot-lda에는 이미 "deliver"라는 심볼릭 링크가 있습니다. 이는 dovecot-lda에 대한 하드 코딩을 방지할 수 있는 일반적인 참조입니다. 그래서 /usr/lib/dovecot/deliver를 /usr/lib/dovecot/sieve-pipe에 복사했습니다.

다섯째: dovecot-lda 실행 파일 자체의 권한이 755인지 확인하세요. "deliver"에 대한 권한은 777로 표시되지만, 대상의 실제 권한은 를 통해 확인할 수 있습니다 ls -LaAFl /usr/lib/dovecot/deliver. 755는 이러한 목적에 완벽합니다.

요약:

  • 귀하의 체 스크립트는 다음과 같이 말합니다 pipe :copy.
  • 이 지침은 통과되었습니다 require ["vnd.dovecot.pipe", "copy"....
  • :copy 다음에 나오는 모든 명령은 :copy로 식별되는 폴더에 정의되어야 합니다.sieve_pipe_bin_dir활성 Dovecot .conf 파일에서 이 변수를 설정하려면 Dovecot을 다시 시작해야 합니다.
  • OP의 경우 이는 /usr/lib/dovecot/sieve-pipe에 /usr/bin/rspamc를 가리키는 "rspamc"에 대한 심볼릭 링크가 있어야 함을 의미합니다.

좋아요, 몇 년 늦었지만 이 Q&A를 우연히 발견한 분들을 위한 것입니다.

관련 정보