dpkg-reconfigure:对话框前端成功设置 postfix;非交互式前端失败

dpkg-reconfigure:对话框前端成功设置 postfix;非交互式前端失败

(注意:在这个问题中,前导#表示根提示,而不是注释。另外,我用 替换了实际的主机名<myhostname>。)

作为debconf (7)man-page 状态,dpkg-reconfigure可以通过多个前端中的任何一个来调用,包括默认的 ("对话“)交互式前端,以及“非交互式“ 前端。

我认为跑步

# dpkg-reconfigure postfix

援引对话前端,并按下Enter以回答每个问题,应该相当于运行以下内容吗?

# dpkg-reconfigure -f noninteractive postfix

如果是这样,那么我不明白以下的差异。

差异

在我的网络主机映像中新安装有 Debian 9 “Stretch” 的 VPS(已安装 postfix)上,我使用以下命令进行预置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 最终可以发送邮件。这似乎是解决上述故障的可行方法,但它肯定违反了最小意外法则并且感觉好像它可能是不应依赖的未定义行为。

答案1

Postfix 配置文件包括/etc/mailname 无法改变使用debconf-set-selectionsdpkg-reconfigure写出 postfix 配置文件。我花了太多时间试图找出原因...

为什么?

dpkg-reconfigure -f noninteractive返回值跳过 30 个问题对于所有问题(并使用debconf-set-selections预设),然后中的代码/var/lib/dpkg/info/postfix.config不会将 debconf 设置设置为已更改,/var/lib/dpkg/info/postfix.postinst然后不会写入任何 postfix 配置。

解决方法?

  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. 最佳:使用替代开关管理/etc/postfix/main.cf等选项后置配置.(建立echo "postfix postfix/main_mailer_type select No configuration" | debconf-set-selections安全网可能是个好主意)

相关内容