cómo responder a todos los diálogos interactivos y preguntas que no son de diálogo

cómo responder a todos los diálogos interactivos y preguntas que no son de diálogo

Quiero ejecutar este comando en Ubuntu 18.04 desde el código del nodo js, ​​así que no puedo responder a las indicaciones y debo llamarlo una vez.

sudo apt-get install --install-recommends linux-generic-hwe-18.04

con el siguiente truco lo he hecho

printf '\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04

pero luego aparece una pregunta en el cuadro de diálogo que dice que la segunda opción está seleccionada, pero mi respuesta es la primera opción, también conocida como "instalar la versión del mantenedor del paquete" a continuación, el truco no funciona.

┌─────────────────────────────────┤  ├─────────────────────────────────┐
│ A new version of /boot/grub/menu.lst is available, but the version   │
│ installed currently has been locally modified.                       │
│                                                                      │
│ What would you like to do about menu.lst?                            │
│                                                                      │
│     install the package maintainer's version                         │
│     keep the local version currently installed                       │
│     show the differences between the versions                        │
│     show a side-by-side difference between the versions              │
│     show a 3-way difference between available versions               │
│     do a 3-way merge between available versions (experimental)       │
│     start a new shell to examine the situation                       │
│                                                                      │
│                                                                      │
│                                <Ok>                                  │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

Ninguno de los siguientes funciona

printf '\n1\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04 printf '\n\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04

También probé muchos métodos como los siguientes pero no funcionó.

sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

Me encuentro con este tipo de preguntas muchas veces, por ejemplo, en preguntas sobre libssl. Por favor, dígame ¿cómo puedo responder a este tipo de preguntas? Quiero responder a todas las preguntas en primer lugar cuando ejecuto el comando.

Respuesta1

Dpkg en realidad ofrece un método para automatizar la respuesta a preguntas de diálogo, y es muy popular al preconfigurar una instalación (principalmente servidor ubuntu, aunque no es compatible con el nuevo instalador), ya que dichos instaladores tienden a tener una gran cantidad de menús y opciones de menú.

¿Qué es un archivo debconf?


Adebconfarchivo (configuración de Debian),también conocido como archivo semilla, es un archivo que enumera los parámetros y las preguntas formuladas por el instalador (palabra por palabra, tal como está) y nuestras respuestas. Si falta una pregunta o se responde con una respuesta no compatible, se elegirá un valor predeterminado (si es posible).

Cada paquete tiene unlista de configuración, incluso si no se hicieron preguntas durante el proceso de instalación y se utilizaron valores predeterminados. Al reinstalar un paquete y no especificar ninguna configuración nueva, se utilizan las ya conocidas por la máquina. Nota:Los archivos debconf en realidad no configuran los paquetes, simplemente contienen un conjunto de preguntas y valores de respuestas utilizados por el instalador.

¿Cómo podemos ver o crear selecciones de paquetes debconf?


  • Para enumerar todas las selecciones realizadas para cada paquete instalado, simplemente utilice debconf-get-selections.
  • Para enumerar un paquete específico, utilice debconf-get-selections |grep '<my_package_name>'.
  • Para cambiar el valor de una respuesta existente con otro valor o agregar nuevas selecciones desde la línea de comando, use debconf-set-selections '<my_package_selection_stanza>'.
  • Para cambiar o agregar valores de un archivo, use debconf-set-selections '<my_file_location>'.

Consulte las páginas del manual para obtener más información:debconf-obtener-selecciones(1),debconf-conjunto-selecciones(1).

Generalmente es difícil encontrar la lista de selección completa correcta y un muy buen método es instalar primero un paquete, volcar sus selecciones en un archivo, editar las selecciones relevantes y configurar las nuevas selecciones del archivo. También puede canalizar una cadena o el contenido de un archivo al comando set:

echo "some selection" |debconf-set-selections

Comprender la sintaxis de debconf:


Aquí hay un ejemplo de dos selecciones de paquetes debconf, una es para lightdm (un administrador de pantalla de ubuntu) y algunas estrofas de selecciones de grub:

$debconf-get-selections |grep lightdm
lightdm shared/default-x-display-manager   select   lightdm
lightdm lightdm/daemon_name   string   /usr/sbin/lightdm

$debconf-get-selections |grep grub-pc
grub-pc grub-pc/chainload_from_menu.list boolean true
grub-pc grub-pc/timeout string 10
grub-pc grub-pc/install_devices multiselect

Como podemos ver, la sintaxis es muy intuitiva: la primera parte es el nombre del paquete, seguida de un '/' y un nombre de pregunta/configuración. Después viene un método de respuesta y una respuesta.

Inyectar selecciones de debconf y reconfigurar paquetes


debconf-set-selectionsEl comando actualizó la base de datos debconf almacenada en el sistema operativo. Es posible establecer una lista de selección antes de instalar nuevos paquetes, y esos se utilizarán. Para los paquetes ya instalados, no es necesario realizar una purga. Uso sencillo dpkg-reconfigure '<my_package_name>'después de aplicar las nuevas selecciones.

También puede definir un nivel de debconf, permitiendo que solo aparezcan y respondan algunas preguntas/mensajes de confirmación, o definir que solo se harán preguntas críticas:

dpkg-reconfigure -p '<level>' '<my_package_name>'

Los niveles disponibles son: bajo, medio, alto o crítico. Más información sobre debconf aquí:debianwiki/debconf. Si desea deshabilitar absolutamente cualquier cuadro de diálogo (recomendado solo cuando sus selecciones se ajustan exactamente a lo deseado), use la opción No interactivo: dpkg-reconfigure --frontend Noninteractive '<package_name>'.

Respuesta2

Si desea responder mediante programación a las indicaciones de un programa interactivo, debe utilizar expect. Instale el expectpaquete y escriba un script que ejecute su programa y responda las indicaciones. La disposición general del guión será la siguiente:

#!/usr/bin/expect

spawn <command_to_run>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
...
expect <something_that_should_appear_at_the_very_end>
exit

Se necesita algo de práctica para utilizar expect correctamente, pero una vez que te acostumbras, es una herramienta extremadamente útil.

información relacionada