Przekazywanie wartości wejściowych do dpkg-reconfigure w sposób nieinteraktywny
On 18 lutego, 2021 by adminChciałbym skonfigurować pakiet ubuntu przez dpkg-reconfigure ze wszystkimi wartościami dostarczonymi przez non- tryb interaktywny (w skrypcie).
W rzeczywistości mój przypadek to konfiguracja firebirda ( http://www.firebirdsql.org/manual/ubusetup.html ), że podczas używania polecenia:
sudo dpkg-reconfigure firebird2.5-superclassic -freadline
pyta mnie o 2 wartości, gdzie odpowiedzi byłyby „Y” i „newpwd”.
Przykładowe wyjście wygląda 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 strings
za 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 zadziałało i wymagało podania wartości.
Wszelkie pomysły, jak karmić wymagane wartości do skryptu?
Odpowiedź
Zawsze możesz użyć oczekuj, że język zautomatyzuje interakcję z procesem, który oczekuje jego danych wejściowych na . Tak naprawdę nie używałem go wcześniej, więc nie mogę tutaj dodać kodu, ale Twój to typowy przypadek użycia.
AKTUALIZACJA:
[Peter Butkovic] Uważam, że wskazanie mi expect
jest właściwym kierunkiem, ten skrypt zakończyłem na:
#!/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
Komentarze
- dziękuję za wskazanie mi właściwego kierunku. Uważam tę odpowiedź za poprawną, ponieważ było to łatwe do wdrożenia rozwiązanie.
- Obawiałbym się możliwości problemów z i18n, ale w przypadku ” użytku domowego ” to wydaje się bezpieczne.
Odpowiedź
Pakiety Debiana używają debconf , aby zebrać ustawienia dotyczące czasu instalacji. Debconf obsługuje wiele interfejsów użytkownika, aby monitować użytkownika o wartości. Opcja -f
w dpkg-reconfigure
wybiera, którego interfejsu debconf użyć.
readline
nakładka jest przeznaczona do użytku interaktywnego. Nie używaj go w automatycznym skrypcie.
Jeśli domyślne wartości są w porządku, po prostu użyj nakładki noninteractive
.
Jeśli chcesz podać różne wartości, masz dwie możliwości. Możesz trzymać się nakładki noninteractive
i wstępnie wprowadzić bazę danych debconf . Najłatwiejszym sposobem jest zainstalowanie pakietu na jednym komputerze i skonfigurowanie go interaktywnie, a następnie wyodrębnienie odpowiednich części z /var/cache/debconf/config.dat
i przesłanie tego pliku do debconf:
DEBCONF_DB_OVERRIDE="File {/path/to/config.dat}" dpkg-reconfigure -fnoninteractive firebird2.5-superclassic
Inną metodą jest użycie interfejsu editor
i ustawienie zmiennej środowiskowej VISUAL
(lub EDITOR
, ale VISUAL
ma pierwszeństwo przed EDITOR
, jeśli jest ustawione ) do programu, który przyjmuje jako argument plik zawierający bieżące ustawienia i nadpisuje ten plik żądanymi ustawieniami.
Komentarze
- Niemusisz samodzielnie przeanalizować
/var/cache/debconf/config.dat
. Możesz użyćdebconf-get-selections
z pakietudebconf-utils
. Zobacz na przykład to . - Poza tym ' nie jestem pewien, czy wstępne podawanie jest dobrze pasuje tutaj. ' mówimy o uruchomieniu
dpkg-reconfigure
, co ja ' zgaduję, że operator chce zautomatyzować, ponieważ on ' będzie to robił często. - dzięki za podpowiedzi. Postanowiłem przejść na oczekiwany skrypt. Nie zbadałem tutaj bardziej szczegółowo '.
- @JosephR. Rzeczywiście,
debconf-get-selections
może być tutaj przydatne. Jeśli Piotr chce to robić często z różnymi wartościami, powinien generowaćconfig.dat
dynamicznie (jest to ' to prosty format). Jest to łatwiejsze niżexpect
.expect
to ścieżka desperacji. Na przykład ' ulegnie awarii, jeśli nowa wersja pakietu wprowadzi nowe pytanie (lub potrzebujesz znacznie bardziej wyrafinowanego skryptu). - @ JosephR, link o pre-seeding, który opublikowałeś, już nie działa, spróbuj tego: zacks.eu/debian-preseed
Odpowiedź
Użyj polecenia debconf-set-selections
, 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 krok.
Pierwszą rzeczą do zrobienia jest interaktywna instalacja pakietu i pobranie wybranych opcji przez (zmień firebird
na nazwę swojego pakietu):
sudo debconf-get-selections | grep ^firebird
lub:
grep -C2 firebird /var/cache/debconf/config.dat
Następnie wstępnie zapełnij bazę danych debconf odpowiedziami z 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 pakietu ttf-mscorefonts-installer
:
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
Uwaga: Dostępne opcje wejściowe mogą być ze standardowego wejścia lub z pliku.
Sprawdź: man debconf-set-selections
, aby uzyskać więcej informacji.
Alternatywnym sposobem jest używać Kickstart .
Komentarze
- debconf-set-selections nie ' t wydaje się działać we wszystkich przypadkach, np .: exim.
- debconf-set-selections NIE uruchamia skryptu konfiguracyjnego wbudowanego w pakiet deb, który zmieniasz ing. Ustawia tylko wybory, o które prosi pakiet, a które są tylko jego pierwszą częścią. dpkg-reconfigure uruchamia obie części.
- To powinna być poprawna odpowiedź na to pytanie.
Odpowiedź
” Grzebałem w okolicy przez około godzinę, próbując skondensować rozwiązanie tego problemu do jednej linijki i wreszcie je znalazłem: debconf-set -selections
echo "debconf debconf/frontend select noninteractive" | sudo debconf-set-selections
To zmusi debconf do używania ustawień domyślnych i nie spowoduje błędu. Możesz także ustawić domyślne ustawienia konfiguracji dla dowolnego pakietu Debiana, zobacz stronę podręcznika , aby uzyskać więcej informacji.
Komentarze
- Isn ' t to samo co
sudo dpkg-reconfigure debconf -f noninteractive
lubexport DEBIAN_FRONTEND=noninteractive
?
Odpowiedź
Próbowałem wykonać skryptową rekonfigurację ustawień LDAP (pakiet ldap-auth-config) przy użyciu polecenia debconf-get-selections / set- wspomniana powyżej metoda selekcji, tylko po to, aby stwierdzić, że ten pakiet ignoruje ustawienia w debco nf po pierwszej instalacji. Możesz użyć debconf do pre-seed przed instalacją, ale po instalacji ldap-auth-config woli nadpisać twoje ustawienia debconf tym, co jest ustawione w systemowych plikach konfiguracyjnych, którymi zarządza. Pakiet pam-auth-config zachowuje się tak samo.
Mechanizm EDITOR / VISUAL jest również trudny w użyciu w tym przypadku, ponieważ ldap-auth-config wywołuje go wiele razy dla różnych zestawów pytań. Można to łatwiej obsłużyć za pomocą skryptu oczekiwania lub bezpośrednio modyfikując pliki konfiguracyjne systemu. Dlatego nie zawsze łatwo jest uniknąć odwrotu od oczekiwań!
Odpowiedź
Moja wersja spodziewaj się rozwiązania do zainstalowania ArangoDB .deb przy użyciu pexpect
import pexpect import os os.environ["DEBIAN_FRONTEND"]= "readline" child = pexpect.spawnu("dpkg -i arangodb3_3.6.2-1_amd64.deb") child.expect("user:") child.sendline("defg") child.expect("user:") child.sendline("defg") child.expect("Automatically upgrade database files") child.sendline("yes") child.expect("Database storage engine") child.sendline("1") child.expect("Backup database files before upgrading") child.sendline("no") child.expect(pexpect.EOF)
Dodaj komentarz