Indføring af inputværdier til dpkg-omkonfigurering på en ikke-interaktiv måde
On februar 18, 2021 by adminJeg vil gerne konfigurere ubuntu-pakke via dpkg-reconfigure med alle de værdier, der leveres via ikke- interaktiv tilstand (i scriptet).
Faktisk er mit tilfælde firebird confiiguration ( http://www.firebirdsql.org/manual/ubusetup.html ), at når du bruger kommando:
sudo dpkg-reconfigure firebird2.5-superclassic -freadline
beder mig om de 2 værdier, hvor svarene ville være “Y” og “newpwd”.
Eksempel på output ser sådan ud:
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
Jeg har prøvet here strings
via bash-script sådan:
sudo dpkg-reconfigure firebird2.5-superclassic -f readline << EOF Y newpwd EOF
Dette fungerede dog ikke af en eller anden grund, og det bad om, at værdierne skulle leveres.
Eventuelle ideer til, hvordan man fodrer de krævede værdier til script?
Svar
Du kan altid bruge forventer, at sprog automatiserer interaktion med en proces, der forventer dets input på en . Jeg har ikke rigtig brugt det før, så jeg kan ikke rigtig tilføje kode her, men din er en typisk brugssag.
UPDATE:
[Peter Butkovic] Jeg overvejer at pege mig på expect
som en rigtig retning, dette script sluttede jeg 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
- tak for at pege mig i den rigtige retning. Jeg betragter dette svar som korrekt, da det var den nemme at implementere løsningen.
- Jeg ville være forsigtig med muligheden for i18n-problemer, men til ” hjemmebrug ” dette synes sikkert.
Svar
Debian-pakker bruger debconf for at indsamle indstillinger for installationstid. Debconf understøtter flere frontends for at bede brugeren om værdier. Indstillingen -f
til dpkg-reconfigure
vælger, hvilken debconf-frontend der skal bruges.
readline
frontend er designet til interaktiv brug. Brug det ikke i et automatisk script.
Hvis standardværdierne er fine, skal du blot bruge noninteractive
frontend.
Hvis du vil angive forskellige værdier, du har to muligheder. Du kan holde fast ved noninteractive
frontend, og forudså debconf-databasen . Den nemmeste måde at gøre dette på er at installere pakken på en maskine og konfigurere den interaktivt og derefter udpakke de relevante dele fra /var/cache/debconf/config.dat
og levere denne fil til debconf:
DEBCONF_DB_OVERRIDE="File {/path/to/config.dat}" dpkg-reconfigure -fnoninteractive firebird2.5-superclassic
En anden metode er at bruge editor
frontend og indstille miljøvariablen VISUAL
(eller EDITOR
, men VISUAL
har forrang for EDITOR
) til et program, der tager en fil, der indeholder de aktuelle indstillinger som et argument, og overskriver den fil med de ønskede indstillinger.
Kommentarer
- Nejhar brug for at analysere
/var/cache/debconf/config.dat
dig selv. Du kan brugedebconf-get-selections
fradebconf-utils
-pakken. Se f.eks. dette . - Også ‘ er ikke sikker på, om forudbestemmelse er den lige her. Vi ‘ taler om at køre
dpkg-reconfigure
, som jeg ‘ gætter på, at OP vil automatiser, fordi han ‘ gør det ofte. - tak for tip. besluttede at gå efter forventet script. undersøgte ‘ ikke dybere her.
- @JosephR. Faktisk vil
debconf-get-selections
sandsynligvis være nyttigt her. Hvis Peter ofte vil gøre dette med forskellige værdier, skal han generere enconfig.dat
dynamisk (det ‘ er et simpelt format). Dette er lettere endexpect
.expect
er desperationens vej. For eksempel ‘ nedbrydes, hvis en ny version af pakken introducerer et nyt spørgsmål (ellers har du brug for et langt mere sofistikeret script). - @ JosephR linket om præsåning, du har sendt, fungerer ikke længere, prøv dette: zacks.eu/debian-preseed
Svar
Brug debconf-set-selections
kommando til at indsætte nye værdier i debconf-databasen (/var/cache/debconf/config.dat
).
Elis svar var ikke klart for mig, så jeg forklarer det trin for trin trin.
Den første ting at gøre er at installere pakken interaktivt og få de valgte valg ved (skift firebird
til dit pakkenavn):
sudo debconf-get-selections | grep ^firebird
eller:
grep -C2 firebird /var/cache/debconf/config.dat
Forudså så debconf-databasen med svar med debconf-set-selections
, for eksempel:
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
hvor syntaksen er:
echo foo-owner-package-name foo-template-name value-type value | debconf-set-selections
Her er et andet eksempel på ttf-mscorefonts-installer
pakke:
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
Bemærk: Indgangsvalgene kan være enten fra standardindgangen eller filen.
Kontroller: man debconf-set-selections
for yderligere information.
Alternativ måde er at bruge Kickstart .
Kommentarer
- debconf-set-selections ikke ‘ t virker i alle tilfælde, fx: exim.
- debconf-set-selections kører IKKE konfigurationsscriptet indbygget i den deb-pakke, du ændrer ing. Det indstiller kun de valg, pakken beder om, som kun er den første del af den. dpkg-reconfigure kører begge dele.
- Dette skal være det rigtige svar på dette spørgsmål.
Svar
Jeg har stukket rundt i cirka en time bare ved at forsøge at kondensere løsningen til dette ned til en one-liner, og jeg fandt det endelig: debconf-set -valg
echo "debconf debconf/frontend select noninteractive" | sudo debconf-set-selections
Dette vil tvinge debconf til at bruge standardindstillingerne og ikke bugse dig. Du kan også indstille konfigurationsstandarderne for enhver Debian-pakke, se manpage for mere info.
Kommentarer
- Er ikke ‘ t det samme som
sudo dpkg-reconfigure debconf -f noninteractive
ellerexport DEBIAN_FRONTEND=noninteractive
?
Svar
Jeg har forsøgt at udføre scriptet omkonfiguration af LDAP-indstillinger (ldap-auth-config-pakke) ved hjælp af debconf-get-selections / set- selektionsmetode nævnt ovenfor, kun for at finde ud af, at denne pakke ignorerer indstillinger i debco nf efter første installation. Du kan bruge debconf til at pre-seed inden installation, men efter installation foretrækker ldap-auth-config at overskrive dine debconf-indstillinger med det, der er angivet i systemkonfigurationsfiler, det administrerer. Pakke pam-auth-config har samme adfærd.
EDITOR / VISUAL-mekanismen er også vanskelig at bruge i dette tilfælde, fordi ldap-auth-config påberåber det flere gange for forskellige sæt spørgsmål. Det kan håndteres lettere med et forventet script eller ved direkte at ændre systemkonfigurationsfilerne. Så det er ikke altid let at undgå at falde tilbage til at forvente!
Svar
Min version af forvent løsning til at installere ArangoDB .deb ved hjælp af 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)
Skriv et svar