Подача входных значений для dpkg-переконфигурирования неинтерактивным способом

23

Я хотел бы настроить пакет ubuntu через dpkg-переконфигурировать со всеми значениями, предоставленными в неинтерактивном режиме (в скрипте).

На самом деле мой случай - конфигурация firebird ( http://www.firebirdsql.org/manual/ubusetup.html ), что при использовании команды:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

спрашивает меня о 2 значениях, где ответы будут «Y» и «newpwd».

Пример вывода выглядит так:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline
 * Firebird 2.5 superclassic server not running
Configuring firebird2.5-superclassic
------------------------------------

Accept if you want Firebird server to start automatically.

If you only need the Firebird client and there are no databases that will be served by this host, decline.

Enable Firebird server? Y


Password for firebird 2.5
-------------------------

Firebird has a special user named SYSDBA, which is the user that has access to all databases. SYSDBA can also create new databases and users. Because of this, it 
is necessary to secure SYSDBA with a password.

The password is stored in /etc/firebird/2.5/SYSDBA.password (readable only by root). You may modify it there (don't forget to update the security database too, 
using the gsec utility), or you may use dpkg-reconfigure to update both.

To keep your existing password, leave this blank.

Password for SYSDBA: 


 * Starting Firebird 2.5 superclassic server...
   ...done.
 * Firebird 2.5 superclassic server already running

Я пробовал here stringsчерез bash скрипт так:

sudo dpkg-reconfigure firebird2.5-superclassic -f readline << EOF
Y
newpwd
EOF

Однако по какой-то причине это не сработало и потребовало предоставить значения.

Любые идеи, как передать необходимые значения для сценария?

Петр Буткович
источник

Ответы:

11

Вы всегда можете использовать ожидаемый язык для автоматизации взаимодействия с процессом, который ожидает его ввода в tty. Я действительно не использовал его раньше, поэтому я не могу добавить код здесь, но ваш типичный пример использования.

ОБНОВИТЬ:

[Петр Буткович] Я считаю, что указывать меня expectкак правильное направление, этот сценарий я закончил:

#!/usr/bin/expect

spawn dpkg-reconfigure firebird2.5-superclassic -freadline
expect "Enable Firebird server?"
send "Y\r"

expect "Password for SYSDBA:"
send "newpwd\r"

# done
expect eof
Джозеф Р.
источник
спасибо, что указал мне правильное направление. Я считаю этот ответ правильным, так как это было простое решение.
Петр Буткович
Я бы с осторожностью относился к возможности проблем с i18n, но для «домашнего использования» это кажется безопасным.
Jasen
20

Пакеты Debian используют debconf для сбора настроек времени установки. Debconf поддерживает несколько внешних интерфейсов, чтобы запрашивать у пользователя значения. -fВариант dpkg-reconfigureвыбирает , какой Debconf интерфейс для использования.

Веб- readlineинтерфейс предназначен для интерактивного использования. Не используйте это в автоматическом сценарии.

Если значения по умолчанию в порядке, просто используйте noninteractiveвнешний интерфейс.

Если вы хотите указать разные значения, у вас есть два варианта. Вы можете придерживаться noninteractiveвнешнего интерфейса и задавать базу данных debconf . Самый простой способ сделать это - установить пакет на одну машину и настроить его в интерактивном режиме, а затем извлечь соответствующие части /var/cache/debconf/config.datи передать этот файл в debconf:

DEBCONF_DB_OVERRIDE='File {/path/to/config.dat}' dpkg-reconfigure -fnoninteractive firebird2.5-superclassic

Другой метод заключается в использовании editorвнешнего интерфейса и установке переменной среды VISUAL(или EDITOR, но VISUALимеет приоритет над EDITORней, если она задана) программы, которая принимает в качестве аргумента файл, содержащий текущие настройки, и перезаписывает этот файл нужными настройками.

Жиль "ТАК - перестань быть злым"
источник
6
Не нужно разбирать /var/cache/debconf/config.datсебя. Вы можете использовать debconf-get-selectionsиз debconf-utilsпакета. Смотрите это, например.
Джозеф Р.
Кроме того, я не уверен, подходит ли здесь предпосевная посадка. Мы говорим о беге dpkg-reconfigure, который, я думаю, ОП хочет автоматизировать, потому что он будет делать это часто.
Джозеф Р.
спасибо за подсказки. решил пойти на ожидаемый сценарий. не расследовать глубже здесь.
Петр Буткович
2
@JosephR. Действительно, debconf-get-selectionsскорее всего, здесь будет полезно. Если Питер хочет делать это часто с разными значениями, он должен генерировать config.datдинамически (это простой формат). Это проще чем expect. expectэто путь отчаяния. Например, он выйдет из строя, если в новой версии пакета появится новый вопрос (или вам понадобится более сложный сценарий).
Жиль "ТАК - перестань быть злым"
@JosephR ссылка о предварительном посылке, которую вы разместили, больше не работает, попробуйте это: zacks.eu/debian-preseed
cjohnson318
13

Используйте debconf-set-selectionsкоманду для вставки новых значений в базу данных debconf ( /var/cache/debconf/config.dat).


Ответ Илии был неясен для меня, поэтому я объясню это шаг за шагом.

Первое, что нужно сделать, это установить пакет в интерактивном режиме и получить выбранные варианты (измените firebirdимя пакета):

sudo debconf-get-selections | grep ^firebird

или:

grep -C2 firebird /var/cache/debconf/config.dat

Затем предварительно заполните базу данных debconf ответами debconf-set-selections, например:

echo firebird2.5-superclassic shared/firebird/enabled boolean true | sudo debconf-set-selections -v
echo firebird2.5-superclassic shared/firebird/sysdba_password/new_password password foo | sudo debconf-set-selections -v

где синтаксис:

echo foo-owner-package-name foo-template-name value-type value | debconf-set-selections

Вот еще один пример для ttf-mscorefonts-installerпакета:

echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections

Примечание. Выбор ввода может быть либо из стандартного ввода, либо из файла.

Проверьте: man debconf-set-selectionsдля получения дополнительной информации.


Альтернативный способ - использовать Kickstart .

kenorb
источник
debconf-set-selections, кажется, не действует во всех случаях, например: exim.
Jasen
1
debconf-set-selections НЕ запускает скрипт конфигурации, встроенный в пакет deb, который вы меняете. Он только устанавливает выбор, который запрашивает пакет, и это только первая его часть. dpkg -conconfigure запускает обе части.
Фред
4

Я около часа копался, пытаясь сжать решение для этого до однострочного, и я наконец нашел его: debconf-set-selections

echo "debconf debconf/frontend select noninteractive" | sudo debconf-set-selections

Это заставит debconf использовать значения по умолчанию и не будет вас беспокоить. Вы также можете установить настройки по умолчанию для любого пакета Debian, смотрите man-страницу для получения дополнительной информации.

Eli
источник
Разве не так же, как sudo dpkg-reconfigure debconf -f noninteractiveили export DEBIAN_FRONTEND=noninteractive?
Кенорб
0

Я пытался выполнить реконфигурацию параметров LDAP с помощью сценария (пакет ldap-auth-config) с помощью метода debconf-get-selections / set-selections, упомянутого выше, только чтобы обнаружить, что этот пакет игнорирует настройки в debconf после начальной установки. Вы можете использовать debconf для предварительного заполнения перед установкой, но после установки ldap-auth-config предпочитает перезаписывать ваши настройки debconf тем, что установлено в системных конфигурационных файлах, которыми он управляет. Пакет pam-auth-config имеет такое же поведение.

Механизм EDITOR / VISUAL также трудно использовать в этом случае, потому что ldap-auth-config вызывает его несколько раз для разных наборов вопросов. Это может быть легко обработано с помощью ожидаемого сценария или путем непосредственного изменения системных конфигурационных файлов. Так что не всегда легко избежать отступления, чтобы ожидать!

Ferg
источник