dpkg-reconfigure tzdata的非交互式方法


76

首次设置Ubuntu服务器时,请确保输入aptitude install tzdata,然后dpkg-reconfigure tzdata正确设置时区。

我正在尝试使用脚本来自动化服务器设置,并注意到这种自动操作的方式,因为它需要用户干预的交互式会话。

有没有办法在不交互的情况下使用dpkg-reconfigure?

Answers:


66

swill的答案不是如何正确完成。如果要无人值守/脚本化的dpkg软件包配置,则要使用debconf预播机制。

在您的情况下,这意味着您必须执行以下操作:

  • 设置以下环境变量以避免debconf尝试向用户提出任何问题:

    export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
    
  • 然后使用以下preseed.txt文件(或所需的任何其他设置)设置debconf:

    tzdata tzdata/Areas select Europe
    tzdata tzdata/Zones/Europe select Berlin
    
  • 您可以通过运行以下命令来设置上述预置文件:

    debconf-set-selections /your/preseed.txt
    
  • 现在,您可以通过apt或运行tzdata(如果尚未安装)dpkg-reconfigure。最后,将根据您在debconf预置文件中指定的内容来设置tzdata。

记住,您可以使用debconf preseeding使更多的工作自动化。例如,在我的前提下,我总是设置:

locales locales/locales_to_be_generated multiselect     en_US.UTF-8 UTF-8
locales locales/default_environment_locale      select  en_US.UTF-8

您始终可以通过运行来检查当前系统的debconf设置debconf-get-selections。输出应该使您对使用debconf preseeding能够自动化多少系统配置有所了解。


4
最后dpkg-reconfigure-f noninteractive无论如何我都必须打电话给…(此处是Ubuntu 12.04 LTS)。否则,您的指示效果很好!
kgadek 2013年

4
可以很好地进行预安装,但是对于已经安装了pkg的情况,我认为这实际上不起作用。AFAIK,您必须先删除pkg。
spinkus's

3
@ S.Pinkus你是对的;/etc/{localtime,timezone}当已经安装tzdata时,有必要删除它。请参阅stackoverflow.com/a/39275359/161114
jah 2016年

通过ssh远程执行此操作:$ ssh node 'export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true;echo -e "tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Amsterdam" > /tmp/tz ; sudo debconf-set-selections /tmp/tz; sudo rm /etc/localtime /etc/timezone; sudo dpkg-reconfigure -f non-interactive tzdata'
hbogert

2
@hbogert您的用法/tmp/tz是一个安全问题。到您从/tmp/tz其他人那里读取时,可能已经为它写入了一个不同的值,或者该文件已经存在(未检查)并且您正在覆盖它。使用mktemp以避免这些问题。另外,您忘记了最后删除临时文件。最后,您不能将of-e用作as的echo可移植参数,而应将其用作printf换行符。
josch

33

16.04中有一个错误(https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1554806,在撰写此答案时尚未修复),该错误会导致/etc/timezone旧内容被覆盖运行时的价值dpkg-reconfigure -f noninteractive tzdata。该修复程序如下(来自上述错误报告):

$ sudo ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime
$ sudo dpkg-reconfigure --frontend noninteractive tzdata
Current default time zone: 'America/New_York'
Local time is now:      Mon Feb 20 07:30:33 EST 2017.
Universal Time is now:  Mon Feb 20 12:30:33 UTC 2017.
$ cat /etc/timezone
America/New_York

无需手动更改的内容/etc/timezone。这在Ubuntu 16.04.2 LTS上对我有用。


最简单,最干净,最好。(在Ubuntu 16.04.4中工作)
David Tabernero M.

这不是错误。相反,预期的行为(ln -fs...在该故障单的注释9中进行了描述。而且,这个问题现在对于SO来说是题外话。请不要通过回答来鼓励OT问题:)
Dan Dascalescu,

21

Dockerfile

FROM ubuntu:xenial

## for apt to be noninteractive
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true

## preesed tzdata, update package index, upgrade packages and install needed software
RUN truncate -s0 /tmp/preseed.cfg; \
    echo "tzdata tzdata/Areas select Europe" >> /tmp/preseed.cfg; \
    echo "tzdata tzdata/Zones/Europe select Berlin" >> /tmp/preseed.cfg; \
    debconf-set-selections /tmp/preseed.cfg && \
    rm -f /etc/timezone /etc/localtime && \
    apt-get update && \
    apt-get install -y tzdata

## cleanup of files from setup
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

在我的实验中,我确定了/etc必要时要删除的文件。


注意:这样做很危险,ENV DEBIAN_FRONTEND...因为使用ENV该方法会使变量在容器也开始运行时仍保留在环境中(有关此警告,请参阅docs.docker.com/engine/reference/builder/#env)。环顾四周,您会发现ARG在这种情况下应该优先使用它(例如ARG DEBIAN_FRONTEND...),因为变量的值仅在构建容器时才有效。
Anon

尽管我想与您一起使用密码api键和类似的东西,但是无论您是否希望将这些配置值嵌入到容器映像中,它仍然取决于这种特定情况。用户的困惑可能是一个问题……
Nils Ballmann '19

11

推进josch的回答;设置debconf db值并在运行前删除/etc/{localtime,timezone}dpkg-reconfigure:-

$ echo "tzdata tzdata/Areas select Europe" > some/file.txt
$ echo "tzdata tzdata/Zones/Europe select Berlin" >> some/file.txt
$ sudo debconf-set-selections some/file.txt
$ sudo rm /etc/timezone
$ sudo rm /etc/localtime
$ sudo dpkg-reconfigure -f noninteractive tzdata
Current default time zone: 'Europe/Berlin'
Local time is now:      Thu Sep  1 17:13:16 CEST 2016.
Universal Time is now:  Thu Sep  1 15:13:16 UTC 2016.

已知此方法可用于:

  • 信得过Ubunty(14.04.5 LTS)

1
您不需要临时文件。Justprintf 'tzdata tzdata/Areas select Europe\ntzdata tzdata/Zones/Europe select Berlin\n' | sudo dpkg-set-selections
Tripleee

而且我认为您无需显式删除将要在/etc其中dpkg-reconfigure重写的文件。
Tripleee'December

谢谢你,你救了我!它也适用于Docker容器:debian:stretch或ubuntu。
卡纳(Vagner do Carmo)

11

这是我Dockerfile的最新Ubuntu 18.04 LTS发行版,改编自@NilsBallmann的回答。我还删除了临时文件创建,并将软件包安装压缩到一个单独的层中:

FROM ubuntu:bionic

RUN export DEBIAN_FRONTEND=noninteractive; \
    export DEBCONF_NONINTERACTIVE_SEEN=true; \
    echo 'tzdata tzdata/Areas select Etc' | debconf-set-selections; \
    echo 'tzdata tzdata/Zones/Etc select UTC' | debconf-set-selections; \
    apt-get update -qqy \
 && apt-get install -qqy --no-install-recommends \
        tzdata \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

3

在具有systemd的Ubuntu 18.04中,我正在使用:

  $ sudo timedatectl set-timezone 'Europe/Madrid'
  $ sudo dpkg-reconfigure --frontend noninteractive tzdata

这去哪儿了?
马克·普里迪

似乎不需要第二个命令。
安德里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.