как отвечать на все интерактивные диалоги и недиалоговые вопросы

как отвечать на все интерактивные диалоги и недиалоговые вопросы

Я хочу запустить эту команду на Ubuntu 18.04 из кода node js, поэтому я не могу отвечать на запросы и должен вызвать ее один раз.

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

с помощью этого трюка я это сделал

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

но затем я получаю диалоговое окно с вопросом о том, что выбран второй вариант, но мой ответ - первый вариант, также известный как «установить версию сопровождающего пакета», трюк ниже не работает

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

ни один из нижеперечисленных вариантов не работает

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

также я пробовал много методов, как ниже, но это не сработало

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

Я сталкиваюсь с такого рода вопросами много раз, например, с вопросами по libssl, пожалуйста, скажите мне, как я могу ответить на такие вопросы? Я хочу ответить на все вопросы в первую очередь, когда я запускаю команду

решение1

Dpkg на самом деле предлагает метод автоматизации ответов на вопросы в диалоговом окне и очень популярен при предварительной установке (в основном на сервере Ubuntu, хотя это не поддерживается новым установщиком), поскольку такие установщики, как правило, имеют огромное количество меню и опций меню.

Что такое файл debconf?


Аdebconf(файл конфигурации Debian),также известный как файл семени, это файл, в котором перечислены параметры и вопросы, заданные установщиком (слово за словом, как есть) и наши ответы на них. Если вопрос отсутствует или на него дан неподдерживаемый ответ - будет выбрано значение по умолчанию (если возможно).

Каждая упаковка имеетсписок конфигураций, даже если в процессе установки не было задано никаких вопросов и использовались значения по умолчанию. При переустановке пакета и не указании новых конфигураций используются уже известные машине. Примечание:Файлы debconf на самом деле не настраивают пакеты, они просто содержат набор вопросов и значений ответов, используемых установщиком.

Как можно просмотреть или создать выборку пакетов debconf?


  • Чтобы вывести список всех выборов, сделанных для каждого установленного пакета, просто используйте debconf-get-selections.
  • Чтобы вывести список определенного пакета, используйте debconf-get-selections |grep '<my_package_name>'.
  • Чтобы изменить значение существующего ответа на другое значение или добавить новые варианты из командной строки, используйте debconf-set-selections '<my_package_selection_stanza>'.
  • Чтобы изменить или добавить значения из файла, используйте debconf-set-selections '<my_file_location>'.

Более подробную информацию смотрите на страницах руководства:debconf-get-selections(1),debconf-set-выборы(1).

Обычно сложно составить правильный полный список выбора, и очень хороший метод — сначала установить пакет, выгрузить его выборки в файл, отредактировать соответствующие выборки и задать новые выборки из файла. Вы также можете передать строку или содержимое файла в команду set:

echo "some selection" |debconf-set-selections

Понимание синтаксиса debconf:


Вот пример двух вариантов выбора пакетов debconf, один из которых предназначен для lightdm (дисплейный менеджер Ubuntu), и несколько строф из вариантов выбора 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

Как мы видим, синтаксис очень интуитивен: первая часть — имя пакета, за которым следует '/' и имя вопроса/конфигурации. После этого следует метод ответа и ответ.

Внедрение выборов debconf и перенастройка пакетов


debconf-set-selectionsКоманда обновила базу данных debconf, хранящуюся в ОС. Можно задать список выбора до установки новых пакетов, и они будут использоваться. Для уже установленных пакетов нет необходимости в очистке. Простое использование dpkg-reconfigure '<my_package_name>'после применения новых выборов.

Вы также можете определить уровень debconf, разрешив появление только некоторых вопросов/подсказок подтверждения, на которые вы можете ответить, или определить, что будут задаваться некритические, но важные вопросы:

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

Доступные уровни: низкий, средний, высокий или критический. Дополнительная информация о debconf здесь:debianwiki/debconf. Если вы хотите полностью отключить все диалоговые окна (рекомендуется только в том случае, если ваш выбор полностью соответствует вашим намерениям), используйте опцию «Неинтерактивно»: dpkg-reconfigure --frontend Noninteractive '<package_name>'.

решение2

Если вы хотите программно отвечать на запросы интерактивной программы, вам следует использовать expect. Установите expectпакет и напишите скрипт, который запускает вашу программу и отвечает на запросы. Общая схема скрипта будет следующей:

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

Для правильного использования Expect требуется некоторая практика, но как только вы к нему привыкнете, он станет чрезвычайно полезным инструментом.

Связанный контент