dpkg-reconfigure:對話框前端成功設置後綴;非互動式前端失敗
(注意在這個問題中,前導
#
表示根提示,而不是評論。另外,我已將實際主機名替換為<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
.我的問題
- 我最初的假設是否正確?
- 上述差異是一個錯誤,還是預期的行為?(如果這是預期的行為,那麼這種設計選擇的基本原理是什麼?)
附錄
如果我在執行
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
然後不會編寫任何後綴配置。解決方法?
- 好:您發現的解決方法是刪除
/etc/postfix/main.cf
哪些強制/var/lib/dpkg/info/postfix.postinst
為 postfix 寫出新配置,其中將包含新debconf-set-selections
選項。dpkg-reconfigure
更好:在互動模式下替代使用並確認問題,在這種情況下/var/lib/dpkg/info/postfix.config
將選項標記為已更改並/var/lib/dpkg/info/postfix.postinst
寫出更改。- 最佳:使用postconf
/etc/postfix/main.cf
管理等選項的替代切換。(有一個安全網可能是個好主意)echo "postfix postfix/main_mailer_type select No configuration" | debconf-set-selections