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

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

sudo apt-get install --install-рекомендует linux-generic-hwe-18.04

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

printf '\ n' | sudo apt-get install --install-рекомендует linux-generic-hwe-18.04

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

┌─────────────────────────────────┤  ├─────────────────────────────────┐
│ 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-рекомендует linux-generic-hwe-18.04 printf '\ n \ n' | sudo apt-get install --install-рекомендует 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 Скажите, пожалуйста, как я могу ответить на такие вопросы? Я хочу ответить на все вопросы, прежде всего, запустив команду

0
задан 22 August 2020 в 17:40

2 ответа

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

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


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

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

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


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

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

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

echo "some selection" |debconf-set-selections

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


Вот пример выбора двух пакетов debconf, один для lightdm (диспетчер отображения Ubuntu) и несколько строф from grub selections:

$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 '' после применения новых выборов.

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

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

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

1
ответ дан 27 August 2020 в 13:18

Если вы хотите программно отвечать на подсказки интерактивной программы, вы должны использовать 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, требуется некоторая практика, но как только вы к нему привыкнете, это будет чрезвычайно полезный инструмент.

0
ответ дан 27 August 2020 в 13:45

Другие вопросы по тегам:

Похожие вопросы: