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-selections
El 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 expect
paquete 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.