以非交互方式将输入值提供给 dpkg-reconfigure

以非交互方式将输入值提供给 dpkg-reconfigure

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

事实上我的情况是火鸟配置(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

然而,由于某种原因这不起作用,并且它要求提供值。

有什么想法如何将所需的值提供给脚本吗?

答案1

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

前端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)设置为一个程序,该程序采用包含当前设置的文件作为参数,并使用所需的设置覆盖该文件。

答案2

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


伊莱回答我不太清楚,所以我将逐步解释。

要做的第一件事是以交互方式安装软件包并通过以下方式获取所选选项(更改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了解更多信息。

注意:如果debconf-get-selections没有找到,则使用

apt-get install debconf-utils

安装。


替代方法是使用启动

答案3

您可以随时使用期待语言自动与需要其输入的进程进行交互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

答案4

我的版本预计使用安装 ArangoDB .deb 的解决方案预期

import pexpect
import os

os.environ['DEBIAN_FRONTEND']= 'readline'

child = pexpect.spawnu('dpkg -i arangodb3_3.6.2-1_amd64.deb')

child.expect('user:')
child.sendline('defg')
child.expect('user:')
child.sendline('defg')
child.expect("Automatically upgrade database files")
child.sendline("yes")
child.expect("Database storage engine")
child.sendline("1")
child.expect("Backup database files before upgrading")
child.sendline("no")
child.expect(pexpect.EOF)

相关内容