Wpisywanie wartości wejściowych do dpkg-rekonfiguruj w nieinteraktywny sposób

23

Chciałbym skonfigurować pakiet ubuntu poprzez dpkg-rekonfiguruj ze wszystkimi wartościami dostarczonymi w trybie nieinteraktywnym (w skrypcie).

W rzeczywistości moim przypadkiem jest konfiguracja firebirda ( http://www.firebirdsql.org/manual/ubusetup.html ), która przy użyciu polecenia:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

prosi mnie o 2 wartości, w których odpowiedzi brzmiałyby „Y” i „newpwd”.

Przykładowe dane wyjściowe wyglądają następująco:

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

Próbowałem here stringsza pomocą skryptu bash w następujący sposób:

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

Jednak z jakiegoś powodu to nie działało i wymagało podania wartości.

Wszelkie pomysły, jak wprowadzić wymagane wartości do skryptu?

Peter Butkovic
źródło

Odpowiedzi:

11

Zawsze możesz użyć oczekiwanego języka, aby zautomatyzować interakcję z procesem, który oczekuje jego wkładu w tty. Tak naprawdę go wcześniej nie używałem, więc nie mogę dodać tutaj kodu, ale twój jest typowym przypadkiem użycia.

AKTUALIZACJA:

[Peter Butkovic] Uważam, że wskazuję mi expectwłaściwy kierunek, skrypt ten zakończyłem:

#!/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
Joseph R.
źródło
dzięki za wskazanie mi właściwego kierunku. Uważam tę odpowiedź za poprawną, ponieważ było to łatwe do wdrożenia rozwiązanie.
Peter Butkovic
Byłbym ostrożny z możliwością wystąpienia problemów z i18n, ale w przypadku „użytku domowego” wydaje się to bezpieczne.
Jasen
20

Pakiety Debiana używają debconf do zbierania ustawień czasu instalacji. Debconf obsługuje wiele nakładek, aby pytać użytkownika o wartości. -fOpcja dpkg-reconfigurewybiera który Debconf frontend do użytku.

readlineNakładka jest przeznaczony do użytku interaktywnego. Nie używaj go w skrypcie automatycznym.

Jeśli wartości domyślne są prawidłowe, po prostu użyj noninteractiveinterfejsu użytkownika.

Jeśli chcesz podać różne wartości, masz dwie opcje. Możesz trzymać się noninteractivefrontendu i przeglądać bazę danych debconf . Najprostszym sposobem na to jest zainstalowanie pakietu na jednym komputerze i skonfigurowanie go interaktywnie, a następnie wyodrębnienie odpowiednich części /var/cache/debconf/config.dati dostarczenie tego pliku do debconf:

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

Inną metodą jest użycie editorinterfejsu użytkownika i ustawienie zmiennej środowiskowej VISUAL(lub EDITOR, ale VISUALma ona pierwszeństwo, EDITORjeśli jest ustawiona) na program, który pobiera plik zawierający bieżące ustawienia jako argument i zastępuje ten plik odpowiednimi ustawieniami.

Gilles „SO- przestań być zły”
źródło
6
Nie musisz się analizować /var/cache/debconf/config.dat. Możesz użyć debconf-get-selectionsz debconf-utilspakietu. Zobacz to na przykład.
Joseph R.
Nie jestem też pewien, czy wstępne wysiewanie jest tutaj odpowiednie. Mówimy o bieganiu dpkg-reconfigure, które, jak sądzę, OP chce zautomatyzować, ponieważ będzie to robił często.
Joseph R.
dzięki za podpowiedzi. zdecydowałem się na skrypt skryptowy. nie badałem tutaj głębiej.
Peter Butkovic
2
@JosephR. Rzeczywiście debconf-get-selectionsmoże się tu przydać. Jeśli Peter chce to robić często z różnymi wartościami, powinien generować config.datdynamicznie (jest to prosty format). To jest łatwiejsze niż expect. expectjest ścieżką desperacji. Na przykład rozpadnie się, jeśli nowa wersja pakietu wprowadzi nowe pytanie (w przeciwnym razie potrzebujesz znacznie bardziej wyrafinowanego skryptu).
Gilles „SO- przestań być zły”
@JosephR link o wstępnym wysiewie już nie działa, spróbuj tego: zacks.eu/debian-preseed
cjohnson318
13

Użyj debconf-set-selectionspolecenia, aby wstawić nowe wartości do bazy danych debconf ( /var/cache/debconf/config.dat).


Odpowiedź Eli nie była dla mnie jasna, więc wyjaśnię to krok po kroku.

Pierwszą rzeczą do zrobienia jest interaktywna instalacja pakietu i uzyskanie wybranych opcji przez (zmień firebirdnazwę pakietu):

sudo debconf-get-selections | grep ^firebird

lub:

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

Następnie wstępnie zaszczep bazę danych debconf odpowiedziami debconf-set-selections, na przykład:

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

gdzie składnia to:

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

Oto kolejny przykład dla ttf-mscorefonts-installerpakietu:

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

Uwaga: Wybrane dane wejściowe mogą pochodzić ze standardowego wejścia lub pliku.

Sprawdź: man debconf-set-selectionswięcej informacji.


Alternatywnym sposobem jest użycie Kickstart .

kenorb
źródło
Wydaje się, że debconf-set-selections nie działa we wszystkich przypadkach, np .: exim.
Jasen
1
debconf-set-selections NIE uruchamia skryptu konfiguracyjnego wbudowanego w zmieniany pakiet deb. Ustawia tylko te opcje, o które prosi pakiet, co jest tylko pierwszą jego częścią. dpkg-reconfigure uruchamia obie części.
Fred
4

Grzebałem w nim przez około godzinę, próbując skondensować rozwiązanie tego problemu do jednej linijki i w końcu to znalazłem: debconf-set-selections

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

Zmusi to debconf do użycia ustawień domyślnych i nie spowoduje błędu. Możesz także ustawić domyślne ustawienia konfiguracji dla dowolnego pakietu Debiana, więcej informacji znajdziesz na stronie man .

Eli
źródło
Czy to nie to samo co sudo dpkg-reconfigure debconf -f noninteractivelub export DEBIAN_FRONTEND=noninteractive?
kenorb
0

Próbowałem wykonać skryptową rekonfigurację ustawień LDAP (pakiet ldap-auth-config) przy użyciu wyżej wspomnianej metody debconf-get-selections / set-selections, ale okazało się, że ten pakiet ignoruje ustawienia w debconf po pierwszej instalacji. Możesz użyć debconf do wstępnego uruchomienia przed instalacją, ale po instalacji ldap-auth-config woli zastąpić ustawienia debconf tym, co jest ustawione w zarządzanych plikach konfiguracyjnych systemu. Pakiet pam-auth-config ma takie samo zachowanie.

Mechanizm EDITOR / VISUAL jest również trudny w użyciu w tym przypadku, ponieważ ldap-auth-config wywołuje go wielokrotnie dla różnych zestawów pytań. Można to łatwiej obsłużyć za pomocą skryptu expect lub bezpośrednio modyfikując systemowe pliki konfiguracyjne. Tak więc nie zawsze łatwo jest się nie spodziewac!

Ferg
źródło