Mata in ingångsvärden till dpkg-omkonfigurera på ett icke-interaktivt sätt
On februari 18, 2021 by adminJag vill konfigurera ubuntu-paket via dpkg-omkonfigurera med alla värden som tillhandahålls via icke- interaktivt läge (i skriptet).
Mitt fall är faktiskt firebird confiiguration ( http://www.firebirdsql.org/manual/ubusetup.html ), att när jag använder kommando:
sudo dpkg-reconfigure firebird2.5-superclassic -freadline
ber mig om de två värdena, där svaret skulle vara ”Y” och ”newpwd”.
Provutdata ser ut så här:
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
Jag har försökt here strings
via bash-skript så här:
sudo dpkg-reconfigure firebird2.5-superclassic -f readline << EOF Y newpwd EOF
Detta fungerade dock inte av någon anledning och den bad om att värdena skulle tillhandahållas.
Några idéer för hur man matar de värden som krävs för att skript?
Svar
Du kan alltid använda förvänta dig att språket automatiserar interaktionen med en process som förväntar sig inmatningen på en . Jag har inte riktigt använt det tidigare så jag kan inte lägga till kod här men din är ett typiskt användningsfall.
UPPDATERING:
[Peter Butkovic] Jag överväger att peka mig på expect
som rätt riktning, detta skript slutade jag med:
#!/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
Kommentarer
- tack för att du pekar åt mig rätt riktning. Jag anser att det här svaret är korrekt eftersom det var den enkla att implementera lösningen.
- Jag skulle vara försiktig med möjligheten till i18n-problem, men för ” hemanvändning ” detta verkar säkert.
Svar
Debian-paket använder debconf för att samla inställningar för installationstiden. Debconf stöder flera frontends för att be användaren om värden. Alternativet -f
till dpkg-reconfigure
väljer vilken debconf-frontend som ska användas.
readline
frontend är utformad för interaktiv användning. Använd det inte i ett automatiskt skript.
Om standardvärdena är bra, använd bara noninteractive
frontend.
Om du vill ange olika värden, du har två alternativ. Du kan hålla fast vid noninteractive
frontend och förbereder debconf-databasen . Det enklaste sättet att göra detta är att installera paketet på en maskin och konfigurera det interaktivt och sedan extrahera relevanta delar från /var/cache/debconf/config.dat
och leverera den här filen till debconf:
DEBCONF_DB_OVERRIDE="File {/path/to/config.dat}" dpkg-reconfigure -fnoninteractive firebird2.5-superclassic
En annan metod är att använda editor
frontend och ställa in miljövariabeln VISUAL
(eller EDITOR
, men VISUAL
har företräde framför EDITOR
) till ett program som tar en fil som innehåller de aktuella inställningarna som ett argument och skriver över den filen med de inställningar du vill ha.
Kommentarer
- Nejmåste analysera
/var/cache/debconf/config.dat
själv. Du kan användadebconf-get-selections
från paketetdebconf-utils
. Se till exempel detta . - Jag ’ är inte säker på om förinställning är rätt passform här. Vi ’ talar om att köra
dpkg-reconfigure
, vilket jag ’ gissar att OP vill automatisera eftersom han ’ gör det ofta. - tack för tips. beslutade att gå till förvänta manus. undersökte inte ’ här.
- @JosephR. Faktum är att
debconf-get-selections
sannolikt kommer att vara användbart här. Om Peter vill göra detta ofta med olika värden bör han generera enconfig.dat
dynamiskt (det ’ är ett enkelt format). Detta är enklare änexpect
.expect
är desperationens väg. Till exempel går det ’ om en ny version av paketet introducerar en ny fråga (annars behöver du ett mycket mer sofistikerat skript). - @ JosephR länken om försådd du publicerade fungerar inte längre, prova det här: zacks.eu/debian-preseed
Svar
Använd debconf-set-selections
för att infoga nya värden i debconf-databasen (/var/cache/debconf/config.dat
).
Elis svar var inte klart för mig, så jag kommer att förklara det steg för steg steg.
Det första du ska göra är att installera paketet interaktivt och få de valda valen genom att (ändra firebird
till ditt paketnamn):
sudo debconf-get-selections | grep ^firebird
eller:
grep -C2 firebird /var/cache/debconf/config.dat
Pre-seeda sedan debconf-databasen med svar av debconf-set-selections
, till exempel:
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
där syntax är:
echo foo-owner-package-name foo-template-name value-type value | debconf-set-selections
Här är ett annat exempel på ttf-mscorefonts-installer
-paket:
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
Obs! Ingångsvalen kan vara antingen från standardingången eller filen.
Kontrollera: man debconf-set-selections
för mer information.
Alternativt sätt är för att använda Kickstart .
Kommentarer
- debconf-set-selections inte ’ t verkar träda i kraft i alla fall, t.ex.: exim.
- debconf-set-selections kör INTE konfigurationsskriptet inbyggt i deb-paketet du ändrar ing. Den anger bara de val paketet efterfrågar som bara är den första delen av det. dpkg-reconfigure kör båda delarna.
- Detta borde vara rätt svar för den här frågan.
Svar
Jag har pockat i ungefär en timme bara försökt att kondensera lösningen för detta till en enfodrad och jag hittade äntligen: debconf-set -val
echo "debconf debconf/frontend select noninteractive" | sudo debconf-set-selections
Detta tvingar debconf att använda standardvärdena och inte bugga dig. Du kan också ställa in standardinställningarna för alla Debian-paket, se manpage för mer info.
Kommentarer
- Är inte ’ t samma som
sudo dpkg-reconfigure debconf -f noninteractive
ellerexport DEBIAN_FRONTEND=noninteractive
?
Svar
Jag har försökt göra skriptkonfigurering av LDAP-inställningar (ldap-auth-config-paket) med debconf-get-selections / set- selections-metod som nämns ovan, bara för att upptäcka att detta paket ignorerar inställningar i debco nf efter första installationen. Du kan använda debconf för att pre-seed före installationen, men efter installationen föredrar ldap-auth-config att skriva över dina debconf-inställningar med vad som helst som anges i systemkonfigurationsfilerna som hanteras. Paketet pam-auth-config har samma beteende.
EDITOR / VISUAL-mekanismen är också svår att använda i det här fallet eftersom ldap-auth-config åberopar det flera gånger för olika uppsättningar frågor. Det kan hanteras enklare med ett förväntat skript eller genom att direkt ändra systemkonfigurationsfilerna. Så det är inte alltid lätt att undvika att förvänta sig!
Svar
Min version av förvänta sig en lösning för att installera ArangoDB .deb med 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)
Lämna ett svar