以非交互方式将输入值馈送到dpkg-reconfigure


23

我想通过dpkg-reconfigure配置ubuntu软件包,并通过非交互模式(在脚本中)提供所有值。

实际上,我的案例是firebird配置(http://www.firebirdsql.org/manual/ubusetup.html),使用命令时:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

向我询问两个值,答案为'Y'和'newpwd'。

示例输出如下所示:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline
 * Firebird 2.5 superclassic server not running
Configuring firebird2.5-superclassic
------------------------------------

Accept if you want Firebird server to start automatically.

If you only need the Firebird client and there are no databases that will be served by this host, decline.

Enable Firebird server? Y


Password for firebird 2.5
-------------------------

Firebird has a special user named SYSDBA, which is the user that has access to all databases. SYSDBA can also create new databases and users. Because of this, it 
is necessary to secure SYSDBA with a password.

The password is stored in /etc/firebird/2.5/SYSDBA.password (readable only by root). You may modify it there (don't forget to update the security database too, 
using the gsec utility), or you may use dpkg-reconfigure to update both.

To keep your existing password, leave this blank.

Password for SYSDBA: 


 * Starting Firebird 2.5 superclassic server...
   ...done.
 * Firebird 2.5 superclassic server already running

我已经尝试过here strings通过bash脚本进行如下操作:

sudo dpkg-reconfigure firebird2.5-superclassic -f readline << EOF
Y
newpwd
EOF

但是,由于某些原因,此方法不起作用,它要求提供值。

任何想法如何将所需的值提供给脚本?

Answers:


11

您始终可以使用期望语言来自动与期望在上输入的过程进行交互tty。我以前从未真正使用过它,所以我不能在这里真正添加代码,但是您的是典型的用例。

更新:

[Peter Butkovic]我认为我的expect方向是正确的,此脚本的结尾是:

#!/usr/bin/expect

spawn dpkg-reconfigure firebird2.5-superclassic -freadline
expect "Enable Firebird server?"
send "Y\r"

expect "Password for SYSDBA:"
send "newpwd\r"

# done
expect eof

感谢您为我指明了正确的方向。我认为此答案是正确的答案,因为它很容易实现。
Peter Butkovic

我会警惕国际化问题的可能性,但是对于“家庭使用”来说,这似乎是安全的。
Jasen

20

Debian软件包使用debconf收集安装时设置。Debconf支持多个前端来提示用户输入值。选择使用哪个debconf前端的-f选项dpkg-reconfigure

readline前端被设计用于交互使用。不要在自动脚本中使用它。

如果默认值合适,则只需使用noninteractive前端即可。

如果要提供不同的值,则有两个选择。您可以坚持使用noninteractive前端,并使用debconf数据库。最简单的方法是将该软件包安装在一台计算机上并进行交互配置,然后从中提取相关部分/var/cache/debconf/config.dat并将此文件提供给debconf:

DEBCONF_DB_OVERRIDE='File {/path/to/config.dat}' dpkg-reconfigure -fnoninteractive firebird2.5-superclassic

另一种方法是使用editor前端,然后将环境变量VISUAL(或设置为EDITOR,但VISUAL优先级高EDITOR)设置为一个程序,该程序将包含当前设置的文件作为参数,然后使用所需的设置覆盖该文件。


6
无需解析/var/cache/debconf/config.dat自己。您可以debconf-get-selectionsdebconf-utils包装中使用。参见示例。
Joseph R.

另外,我不确定预播是否合适。我们正在谈论运行dpkg-reconfigure,我猜OP希望自动化,因为他会经常这样做。
约瑟夫R.13年

谢谢提示。决定去期待脚本。没有在这里进行更深入的调查。
彼得·布特科维奇

2
@JosephR。确实,debconf-get-selections在这里可能很有用。如果Peter希望经常使用不同的值来执行此操作,则他应该config.dat动态生成(这是一种简单的格式)。这比容易expectexpect是绝望的道路。例如,如果新版本的软件包引入了新问题(或者您需要更复杂的脚本),它将崩溃。
吉尔斯(Gilles)'所以

@JosephR有关您播种的预播的链接不再起作用,请尝试以下方法:zacks.eu/debian-preseed
cjohnson318 '18

13

使用debconf-set-selections命令将新值插入debconf数据库(/var/cache/debconf/config.dat)。


Eli的答案对我来说还不清楚,所以我将逐步解释它。

要做的第一件事是以交互方式安装软件包并通过(更改firebird为软件包名称)获得所选的选择:

sudo debconf-get-selections | grep ^firebird

要么:

grep -C2 firebird /var/cache/debconf/config.dat

然后使用的答案预先植入debconf数据库debconf-set-selections,例如:

echo firebird2.5-superclassic shared/firebird/enabled boolean true | sudo debconf-set-selections -v
echo firebird2.5-superclassic shared/firebird/sysdba_password/new_password password foo | sudo debconf-set-selections -v

语法是:

echo foo-owner-package-name foo-template-name value-type value | debconf-set-selections

这是ttf-mscorefonts-installer包的另一个示例:

echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections

注意:输入选择可以来自标准输入,也可以来自文件。

检查:man debconf-set-selections以获取更多信息。


另一种方法是使用Kickstart


debconf-set-selections似乎并非在所有情况下都有效,例如:exim。
Jasen

1
debconf-set-selections不会运行您要更改的deb软件包中内置的配置脚本。它仅设置程序包要求的选择内容,而这只是其中的第一部分。dpkg-reconfigure同时运行这两个部分。
弗雷德

4

我一直在闲逛大约一个小时,只是试图将解决方案压缩成一个单一的类,然后我终于找到了:debconf-set-selections

echo "debconf debconf/frontend select noninteractive" | sudo debconf-set-selections

这将迫使debconf使用默认值而不是使您烦恼。您还可以为任何Debian软件包设置配置默认值,有关更多信息,请参见手册页


sudo dpkg-reconfigure debconf -f noninteractive或不相同export DEBIAN_FRONTEND=noninteractive吗?
kenorb 2015年

0

我一直在尝试使用上述的debconf-get-selections / set-selections方法对LDAP设置(ldap-auth-config程序包)进行脚本化的重新配置,只是发现该程序包在初始安装后会忽略debconf中的设置。您可以在安装前使用debconf进行预设置,但是在安装后ldap-auth-config倾向于使用其管理的系统配置文件中的设置覆盖您的debconf设置。软件包pam-auth-config具有相同的行为。

在这种情况下,也很难使用EDITOR / VISUAL机制,因为ldap-auth-config针对不同的问题集多次调用它。使用期望脚本或直接修改系统配置文件可以更轻松地处理它。因此,避免退回期望值并不总是那么容易!

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.