como responder a todos os diálogos interativos e perguntas sem diálogo

como responder a todos os diálogos interativos e perguntas sem diálogo

eu quero executar este comando no ubuntu 18.04 a partir do código node js, então não posso responder aos prompts e devo chamá-lo uma vez

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

com o truque abaixo eu consegui

imprimirf '\n' | sudo apt-get install --install-recomenda linux-generic-hwe-18.04

mas então recebo uma pergunta na caixa de diálogo informando que a segunda opção está selecionada, mas minha resposta é a primeira opção, também conhecida como "instalar a versão do mantenedor do pacote", o truque abaixo não funciona nele

┌─────────────────────────────────┤  ├─────────────────────────────────┐
│ 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>                                  │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

nenhuma das opções abaixo funciona

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

também tentei vários métodos como abaixo, mas não funcionou

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

Estou enfrentando esse tipo de pergunta muitas vezes, por exemplo, em perguntas sobre libssl, diga-me como posso responder a esse tipo de pergunta? quero responder a todas as perguntas em primeiro lugar que executo o comando

Responder1

Na verdade, o Dpkg oferece um método para automatizar a resposta a perguntas de diálogo e é muito popular ao pré-configurar uma instalação (principalmente servidor Ubuntu, embora não seja suportado pelo novo instalador), já que tais instaladores tendem a ter uma grande quantidade de menus e opções de menu.

O que é um arquivo debconf?


Adebconf(configuração debian) arquivo,também conhecido como arquivo semente, é um arquivo que lista parâmetros e perguntas feitas pelo instalador (palavra por palavra, como estão) e nossas respostas a elas. Se uma pergunta estiver faltando ou for respondida por uma resposta não suportada, um valor padrão será escolhido (se possível).

Cada pacote tem umlista de configuração, mesmo que nenhuma pergunta tenha sido feita durante o processo de instalação e os valores padrão tenham sido usados. Ao reinstalar um pacote e não especificar novas configurações, são utilizadas as já conhecidas pela máquina. Observação:Os arquivos debconf na verdade não configuram os pacotes, eles simplesmente contêm um conjunto de perguntas e valores de respostas usados ​​pelo instalador.

Como podemos visualizar ou criar seleções de pacotes debconf?


  • Para listar todas as seleções feitas para cada pacote instalado, basta usar debconf-get-selections.
  • Para listar um pacote específico, use debconf-get-selections |grep '<my_package_name>'.
  • Para alterar o valor de uma resposta existente por outro valor ou adicionar novas seleções na linha de comando, use debconf-set-selections '<my_package_selection_stanza>'.
  • Para alterar ou adicionar valores de um arquivo, use debconf-set-selections '<my_file_location>'.

Consulte as páginas de manual para obter mais informações:debconf-get-selections(1),debconf-set-selections(1).

Geralmente é difícil criar a lista de seleção completa correta, e um método muito bom é primeiro instalar um pacote, despejar suas seleções em um arquivo, editar as seleções relevantes e definir as novas seleções do arquivo. Você também pode canalizar uma string ou conteúdo de arquivo para o comando set:

echo "some selection" |debconf-set-selections

Compreendendo a sintaxe do debconf:


Aqui está um exemplo de duas seleções de pacote debconf, uma é para lightdm (um gerenciador de exibição do ubuntu) e algumas estrofes de seleções 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, a sintaxe é muito intuitiva: a primeira parte é o nome do pacote, seguido por um '/' e um nome de pergunta/configuração. Depois vem um método de resposta e uma resposta.

Injetando seleções do debconf e reconfiguração de pacotes


debconf-set-selectionscomando atualizou o banco de dados debconf armazenado no sistema operacional. É possível definir uma lista de seleção antes da instalação de novos pacotes, e eles serão usados. Para pacotes já instalados, não há necessidade de limpeza. Uso simples dpkg-reconfigure '<my_package_name>'após aplicar as novas seleções.

Você também pode definir um nível debconf, permitindo que apenas algumas perguntas/prompts de confirmação apareçam e sejam respondidas por você, ou definir que perguntas não críticas devem ser feitas:

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

Os níveis disponíveis são: baixo, médio, alto ou crítico. Mais informações sobre o debconf aqui:debianwiki/debconf. Se você quiser desabilitar totalmente qualquer caixa de diálogo (recomendado apenas quando suas seleções se ajustarem exatamente como pretendido), use a opção Não interativo: dpkg-reconfigure --frontend Noninteractive '<package_name>'.

Responder2

Se você quiser responder programaticamente aos prompts de um programa interativo, você deve usar expect. Instale o expectpacote e escreva um script que execute seu programa e responda aos prompts. O layout geral do script será o seguinte:

#!/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

É preciso um pouco de prática para usar o expect corretamente, mas quando você se acostuma, é uma ferramenta extremamente útil.

informação relacionada