我想通过 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 支持多个前端来提示用户输入值。选择-f
要dpkg-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)