Linux

即使無法讀取其配置文件,procmail 也會返回退出程式碼 0:如何防止?

  • January 24, 2022

我是procmail第一次處理,所以如果以下問題很愚蠢,我深表歉意。在投入procmail生產之前,我正在做一些基本的測試。其中一個產生了一個完全出乎意料的結果,這使得它在我的場景中幾乎毫無價值:

procmail無法讀取其配置文件時,它仍然會0在完成時將其退出程式碼設置為 (true)。這是災難性的,因為在我的場景中,我使用procmail的是從內部執行的 MDA fetchmail。如果procmail無法讀取其配置文件,則無法根據需要處理(傳遞)消息,而是0在完成時設置退出程式碼;fetchmail將此解釋為成功傳遞並刪除上游相應的消息。總之,這會導致這些消息失去。

這種情況下的權限非常複雜(fetchmail++ over ,在自己的使用者帳戶下執行,存在and等等procmail),所以當需要更改某些內容時,很可能有人錯誤地使用了權限。由於上述問題,此類錯誤很可能導致消息失去。cyrdeliver``lmtp``fetchmail``procmail``suid``setgid

因此,如果它無法讀取其配置文件,我想知道如何以procmail失敗退出(退出程式碼以外的程式碼)。0

要了解這是關於什麼的,請考慮以下終端會話(刪除了不相關的行)。請注意,配置目錄中的所有權/權限是故意錯誤的,因為這是我的測試案例。

root@morn /etc/fetchmail # whoami
root

root@morn /etc/fetchmail # dir
total 52K
drwx------   2 fetchmail root 4.0K 2022-01-23 10:09 .
drwxr-xr-x 123 root      root  12K 2022-01-22 17:17 ..
-rw-------   1 fetchmail root 2.4K 2022-01-23 10:09 fetchmailrc
-rw-------   1 root      mail  282 2022-01-23 02:49 procmailrc
-rw-r--r--   1 root      root  110 2022-01-23 00:36 testmessage

root@morn /etc/fetchmail # dir `which procmail`
-rwsr-sr-x 1 root mail 92K 2017-11-16 23:42 /usr/bin/procmail
   
root@morn /etc/fetchmail # cat /etc/systemd/system/pp-fetchmail.service    
User=fetchmail
Group=mail
ExecStart=/usr/bin/fetchmail -f /etc/fetchmail/fetchmailrc --pidfile /run/fetchmail/fetchmail.pid --syslog

root@morn /etc/fetchmail # cat fetchmailrc
poll
pop3.example.com
proto pop3
bad-header accept
user "user1@example.com"
ssl
pass "supersecret"
is "user1" here
no rewrite
mda "/usr/bin/procmail TARGET=user1 /etc/fetchmail/procmailrc"

root@morn /etc/fetchmail # cat testmessage
From: nobody@nowhere.com
To: somebody@somewhere.com
Subject: Test message

This is a test message.

root@morn /etc/fetchmail # sudo -u fetchmail -g mail /usr/bin/procmail /etc/fetchmail/procmailrc < testmessage && echo "procmail exited 0" 
procmail: Couldn't read "/etc/fetchmail/procmailrc"
procmail exited 0

當然,最後兩行是問題所在。有誰知道如何規避它?當然,修復權限會使其正常工作,但這是我明確不要求的。我希望有一個更強大的解決方案,以防出現錯誤(我的或其他人的)。

如果 Procmail 返回成功,則它成功地將消息傳遞到某個地方,儘管顯然不是您想要的。當它用完備份並且無法在任何地方傳遞時,就會發生故障。要找出消息的去向,請檢查日誌文件(如果您沒有明確配置日誌文件,則會發出標準錯誤)。但是,在沒有任何顯式日誌配置的情況下,您將主要只看到實際的傳遞日誌,例如

From sender@example.com  Wed Apr 1, 2022 09:10:11 UTC
Subject: Your inheritance from Nigeria
 Folder: /var/mail/fetchmail                       12524

開箱即用的 Procmail 將DEFAULT在沒有任何其他說明的情況下簡單地發送到。該-m選項需要一個配置文件,如果無法讀取,將失敗並顯示錯誤(退出程式碼 73),但會關閉一些正常傳遞功能,這最終可能不是您想要的。

總體而言,您的配置似乎相當脆弱。TARGET=user它本身對 Procmail 沒有任何意義,所以你真的必須有一個procmailrc文件來處理這些資訊。正常傳遞機制將用於-d user明確傳遞給相關使用者,並穩健地處理回退等。(不過,我對 Fetchmail 不夠熟悉,因此無法就在這裡使用什麼是正確的。)

引用自:https://unix.stackexchange.com/questions/687551