Automation

dpkg-reconfigure:對話框前端成功設置後綴;非互動式前端失敗

  • May 25, 2021

(注意在這個問題中,前導#表示根提示,而不是評論。另外,我已將實際主機名替換為<myhostname>。)

debconf (7)手冊頁所述,dpkg-reconfigure可以使用多個前端中的任何一個呼叫,包括預設(“對話框”)互動式前端和“非互動式”前端。

我認為跑步是對的嗎

# dpkg-reconfigure postfix

呼叫對話框前端,並按下Enter以響應每個問題,應該相當於執行以下?

# dpkg-reconfigure -f noninteractive postfix

如果是這樣,那麼我不理解以下差異。

差異

在從我的網路主機圖像(已經安裝了 postfix)中新填充 Debian 9“Stretch”的 VPS 上,我使用debconf-set-selections

# debconf-set-selections <<< "postfix postfix/destinations string <myhostname>"
# debconf-set-selections <<< "postfix postfix/mailbox_limit string 51200000"              
# debconf-set-selections <<< "postfix postfix/mailname string <myhostname>"    
# debconf-set-selections <<< "postfix postfix/main_mailer_type select Internet Site"      
# debconf-set-selections <<< "postfix postfix/protocols select ipv4"                      
# debconf-set-selections <<< "postfix postfix/root_address string root"                   

如果我然後以dpkg-reconfigure互動方式執行,並按下Enter每個問題,我會得到:

# dpkg-reconfigure postfix
dpkg-reconfigure postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
setting synchronous mail queue updates: false
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf
changing /etc/mailname to <myhostname>
setting myorigin
setting destinations: localhost
setting relayhost: 
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 51200000
setting recipient_delimiter: +
setting inet_interfaces: all
setting default_transport: smtp
setting relay_transport: smtp
setting inet_protocols: ipv4
WARNING: /etc/aliases exists, but does not have a root alias.

Postfix (main.cf) is now set up with the changes above.  If you need to make 
changes, edit /etc/postfix/main.cf (and others) as needed.  To view Postfix 
configuration values, see postconf(1).

After modifying main.cf, be sure to run 'service postfix reload'.

Running newaliases

請注意,這做了很多,包括設置/etc/mailname。至此,postfix 已經準備好發送郵件了。

相比之下,如果我使用相同的 VPS,從新圖像重新開始,並執行相同的命令,除了以dpkg-reconfigure非互動方式呼叫之外,我得到:

# dpkg-reconfigure --frontend noninteractive postfix
Removing sqlite map entry from /etc/postfix/dynamicmaps.cf
Adding sqlite map entry to /etc/postfix/dynamicmaps.cf

Postfix (main.cf) configuration was not changed.  If you need to make changes, 
edit /etc/postfix/main.cf (and others) as needed.  To view Postfix 
configuration values, see postconf(1).

After modifying main.cf, be sure to run 'service postfix reload'.

Running newaliases

請注意,這一次,/etc/mailname沒有設置。此外,此時,postfix 還沒有準備好發送郵件,任何這樣做的嘗試都會導致退回郵件出現在/var/log/mail.log.

我的問題

  1. 我最初的假設是否正確?
  2. 上述差異是一個錯誤,還是預期的行為?(如果這是預期的行為,那麼這種設計選擇的基本原理是什麼?)

附錄

如果我在執行rm /etc/postfix/main.cf之前執行dpkg-reconfigure --frontend noninteractive postfix,那麼/etc/mailname兩者/etc/postfix/main.cf最終都會被創建,並且 postfix 最終準備好發送郵件。對於上述失敗,這似乎是一個可行的解決方法,但它肯定違反了最小意外規則,並且感覺好像它可能是不應該依賴的未定義行為。

一旦後綴配置文件被寫出,後綴配置文件包括/etc/mailname **不能更改。**我花了太多時間試圖找出原因……debconf-set-selections``dpkg-reconfigure

為什麼?

dpkg-reconfigure -f noninteractive返回值30 跳過所有問題的問題(並使用debconf-set-selections預設),/var/lib/dpkg/info/postfix.config然後中的程式碼不會將 debconf 設置設置為已更改,/var/lib/dpkg/info/postfix.postinst然後不會編寫任何後綴配置。

解決方法?

  1. 好:您發現的解決方法是刪除/etc/postfix/main.cf哪些強制/var/lib/dpkg/info/postfix.postinst為 postfix 寫出新配置,其中將包含新debconf-set-selections選項。
  2. dpkg-reconfigure更好:在互動模式下替代使用並確認問題,在這種情況下/var/lib/dpkg/info/postfix.config將選項標記為已更改並/var/lib/dpkg/info/postfix.postinst寫出更改。
  3. 最佳:使用postconf/etc/postfix/main.cf管理等選項的替代切換。(有一個安全網可能是個好主意)echo "postfix postfix/main_mailer_type select No configuration" | debconf-set-selections

引用自:https://serverfault.com/questions/889438