我正在尝试构建一个 shell 脚本来自动将几个软件包安装到 Ubuntu 10.04 服务器上,但在使用 proftpd-basic 时遇到了问题。
我正在使用命令行
apt-get -qy install proftpd-basic >/tmp/install.log
对于大多数软件包来说,这种方法都可以很好地工作,但是 proftpd-basic 似乎需要一些交互(它会询问是否执行 inetd 或独立安装)。
我是否可以以某种方式在命令行上预先选择这个选项,因为我不想让用户被这个问题困扰? - 如果需要的话,我想选择“独立”选项。
编辑:
该过程的交互部分不仅需要简单的 y/n 答案,还需要我使用箭头键导航到我想要的选项,然后按 Enter 进行选择。这可能对这个问题的解决方案有一定影响。
答案1
您可以“预先输入”答案,以便 debconf 看到您已经回答了该问题,并且不会再问一遍。
您需要debconf-utils
软件包中的一些工具:
sudo apt-get install debconf-utils
安装你的程序并手动回答一次问题。然后,你可以询问 debconf 它在数据库中存储了什么:
debconf-get-selections | grep proftpd-basic
可以输入该信息debconf-set-selections
(通过管道或从文件读取)。
华纳的答案更加跨平台(debconf 是 Debian 及其衍生产品独有的技术),但如果问题发生变化,则并不总是适用于不同版本;或者,如果您遇到了一些 debconf 问题,而这些问题只有在您安装了其他软件包时才会被询问。
答案2
对于此类问题,有多种不同的解决方案。我更喜欢使用 shell 脚本,其他人可能更喜欢其他方法。
对于需要输入且没有标志来指定答案的事物的交互,您可以重定向输入。我会读apt-get 手册页在采用此方法之前,请先考虑一下,因为它可能对您要指定的内容具有本机支持。例如:
apt-get -qy install proftpd-basic <<**
RESPONSES GO HERE
**
你也可以使用类似预计. 有些客户端并不总是能够不经过额外努力就能处理输入重定向。
对于日志记录,您可以使用球座并在运行主脚本时重定向 STDERR 和 STDOUT。例如:
bash -x script.sh 2>&1 | tee script.log
set -x
我也经常喜欢用 bash 运行。对于构建脚本,我更喜欢冗长的内容而不是更清晰的输出。