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