在deb包构建中如何用debconf获取任意长度用户输入数组?
在Debian包中收集用户输入的任意字符串数组
完全可行!在Debian包的构建流程里,我们主要靠debconf工具来处理交互式用户输入,哪怕是需要收集数组类的内容也没问题。我给你举个具体的例子,对应你提到的管理员用户池和密码数组的场景:
步骤1:创建debconf模板文件
首先在你的包目录下创建debian/templates文件,用来定义我们要收集的输入项——包括管理员数量、每个管理员的用户名和密码:
Template: mypackage/admin_count Type: string Description: Number of admin users to create: Please enter how many machine admin users you want to set up. Template: mypackage/admin_user_${INDEX} Type: string Description: Username for admin user ${INDEX}: Enter the username for admin user number ${INDEX}. Template: mypackage/admin_pass_${INDEX} Type: password Description: Password for admin user ${INDEX}: Enter the password for admin user number ${INDEX}.
这里的${INDEX}是占位符,后面会用脚本动态替换成具体的数字(比如1、2、3...)。密码类型用password的话,用户输入时会自动隐藏内容,很安全。
步骤2:编写交互式配置脚本
接下来创建debian/config脚本(给它加执行权限:chmod +x debian/config),用来根据用户输入的管理员数量,动态生成后续的提问:
#!/bin/sh set -e # 先询问要创建的管理员数量 db_input medium mypackage/admin_count || true db_go # 获取用户输入的数量 db_get mypackage/admin_count ADMIN_COUNT="$RET" # 循环询问每个管理员的用户名和密码 for i in $(seq 1 "$ADMIN_COUNT"); do db_input medium mypackage/admin_user_${i} || true db_input high mypackage/admin_pass_${i} || true done db_go
脚本里的medium/high是提问的优先级,控制这个问题是否会在默认的交互流程中出现——优先级越高,越容易被展示。
步骤3:在postinst中处理收集到的输入
最后,在debian/postinst脚本里读取这些收集到的值,执行实际的配置操作(比如创建用户):
#!/bin/sh set -e # 获取管理员总数 db_get mypackage/admin_count ADMIN_COUNT="$RET" # 循环处理每个管理员用户 for i in $(seq 1 "$ADMIN_COUNT"); do # 读取用户名 db_get mypackage/admin_user_${i} USERNAME="$RET" # 读取密码 db_get mypackage/admin_pass_${i} PASSWORD="$RET" # 这里执行创建用户的逻辑,示例: useradd -m "$USERNAME" echo "$USERNAME:$PASSWORD" | chpasswd done
同样记得给postinst加执行权限:chmod +x debian/postinst
一些额外注意事项
- 如果需要自动化安装(不需要交互),可以用
debconf-set-selections命令预填所有输入值,比如:echo "mypackage/admin_count string 2" | debconf-set-selections echo "mypackage/admin_user_1 string alice" | debconf-set-selections echo "mypackage/admin_pass_1 string securepass1" | debconf-set-selections - 如果你不想用
debian/config,也可以把动态提问的逻辑放在preinst脚本里,效果是一样的 - 记得在
debian/control文件里声明依赖debconf,确保安装过程中工具可用
内容的提问来源于stack exchange,提问作者kael
相关产品推荐
相关产品推荐

