Eingabe von Eingabewerten an dpkg-reconfigure auf nicht interaktive Weise

23

Ich möchte das Ubuntu-Paket über dpkg-reconfigure mit allen Werten konfigurieren, die über den nicht interaktiven Modus (im Skript) bereitgestellt werden.

Tatsächlich handelt es sich bei meinem Fall um die Konfiguration von Firebird ( http://www.firebirdsql.org/manual/ubusetup.html ).

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

fragt mich nach den 2 Werten, bei denen die Antworten "Y" und "newpwd" lauten.

Die Beispielausgabe sieht folgendermaßen aus:

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

Ich habe es here stringsüber ein Bash-Skript wie folgt versucht :

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

Dies funktionierte jedoch aus irgendeinem Grund nicht und verlangte die Angabe der Werte.

Irgendwelche Ideen, wie man die erforderlichen Werte zum Skript füttert?

Peter Butkovic
quelle

Antworten:

11

Sie können immer die Sprache expect verwenden, um die Interaktion mit einem Prozess zu automatisieren, der seine Eingabe in a erwartet tty. Ich habe es vorher noch nicht wirklich benutzt, daher kann ich hier keinen Code hinzufügen, aber deiner ist ein typischer Anwendungsfall.

AKTUALISIEREN:

[Peter Butkovic] Ich betrachte es expectals richtige Richtung, dieses Drehbuch, mit dem ich endete:

#!/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.
quelle
Danke, dass du mir die richtige Richtung gezeigt hast. Ich halte diese Antwort für richtig, da sie einfach zu implementieren war.
Peter Butkovic
Ich wäre vorsichtig mit der Möglichkeit von i18n-Problemen, aber für den "Heimgebrauch" scheint dies sicher.
Jasen
20

Debian-Pakete verwenden debconf , um Einstellungen für die Installationszeit zu sammeln. Debconf unterstützt mehrere Frontends, um den Benutzer zur Eingabe von Werten aufzufordern. Die -fOption zum dpkg-reconfigureAuswählen des zu verwendenden Debconf-Frontends.

Das readlineFrontend ist für die interaktive Nutzung konzipiert. Verwenden Sie es nicht in einem automatischen Skript.

Wenn die Standardwerte in Ordnung sind, verwenden Sie einfach das noninteractiveFrontend.

Wenn Sie unterschiedliche Werte angeben möchten, haben Sie zwei Möglichkeiten. Sie können sich an das noninteractiveFrontend halten und die Debconf-Datenbank voreinstellen . Der einfachste Weg, dies zu tun, besteht darin, das Paket auf einer Maschine zu installieren und interaktiv zu konfigurieren, dann die relevanten Teile daraus zu extrahieren /var/cache/debconf/config.datund diese Datei an debconf zu liefern:

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

Eine andere Methode ist es, das zu verwenden , editorFrontend und die Umgebungsvariable VISUAL(oder EDITOR, sondern VISUALhat Vorrang vor , EDITORwenn es gesetzt ist) zu einem Programm , das eine Datei mit den aktuellen Einstellungen als Argument enthält , nimmt, und überschreibt die Datei mit den Einstellungen , die Sie möchten.

Gilles 'SO - hör auf böse zu sein'
quelle
6
Keine Notwendigkeit, sich /var/cache/debconf/config.datselbst zu analysieren . Sie können debconf-get-selectionsaus dem debconf-utilsPaket verwenden. Siehe dies zum Beispiel.
Joseph R.
Ich bin mir auch nicht sicher, ob die Voreinstellung hier richtig ist. Wir reden über das Laufen dpkg-reconfigure, was das OP wohl automatisieren möchte, weil er es häufig machen wird.
Joseph R.
danke für hinweise. beschlossen, Skript zu erwarten. Ich habe hier nicht näher nachgeforscht.
Peter Butkovic
2
@ JosephR. In der Tat debconf-get-selectionsdürfte hier von Nutzen sein. Wenn Peter dies oft mit unterschiedlichen Werten tun möchte, sollte er config.datdynamisch generieren (es ist ein einfaches Format). Das ist einfacher als expect. expectist der Weg der Verzweiflung. Zum Beispiel bricht es zusammen, wenn eine neue Version des Pakets eine neue Frage einführt (oder Sie benötigen ein weitaus ausgefeilteres Skript).
Gilles 'SO- hör auf böse zu sein'
@ JosephR Der Link über Pre-Seeding, den Sie gepostet haben, funktioniert nicht mehr. Versuchen Sie
Folgendes
13

Verwenden Sie den debconf-set-selectionsBefehl, um neue Werte in die debconf-Datenbank einzufügen ( /var/cache/debconf/config.dat).


Die Antwort von Eli war für mich nicht klar, deshalb erkläre ich es Schritt für Schritt.

Das erste, was Sie tun müssen, ist, das Paket interaktiv zu installieren und die gewählte Auswahl zu erhalten (ändern firebirdSie den Namen Ihres Pakets):

sudo debconf-get-selections | grep ^firebird

oder:

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

Dann bereiten Sie die Debconf-Datenbank mit Antworten vor debconf-set-selections, zum Beispiel durch:

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

wo Syntax ist:

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

Hier ist ein weiteres Beispiel für ein ttf-mscorefonts-installerPaket:

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

Hinweis: Die Eingabeauswahl kann entweder in der Standardeingabe oder in der Datei erfolgen.

Überprüfen Sie: man debconf-set-selectionsfür weitere Informationen.


Alternativ können Sie Kickstart verwenden .

Kenorb
quelle
debconf-set-selections scheint nicht in allen Fällen wirksam zu sein, zB: exim.
Jasen
1
debconf-set-selections führt NICHT das Konfigurationsskript aus, das in das Deb-Paket eingebaut ist, das Sie ändern. Es werden nur die Auswahlen festgelegt, nach denen das Paket fragt. Dies ist nur der erste Teil davon. dpkg-reconfigure führt beide Teile aus.
Freitag,
4

Ich habe ungefähr eine Stunde lang herumgestöbert und versucht, die Lösung dafür auf einen Einzeiler zu reduzieren. Endlich habe ich sie gefunden: debconf-set-selections

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

Dadurch wird debconf gezwungen, die Standardeinstellungen zu verwenden und Sie nicht zu nerven. Sie können auch die Konfigurationsstandards für jedes Debian-Paket festlegen. Weitere Informationen finden Sie in der Manpage .

Eli
quelle
Ist das nicht dasselbe wie sudo dpkg-reconfigure debconf -f noninteractiveoder export DEBIAN_FRONTEND=noninteractive?
Kenorb
0

Ich habe versucht, die LDAP-Einstellungen (ldap-auth-config package) mithilfe der oben genannten Methode debconf-get-selections / set-selections per Skript zu rekonfigurieren. Dabei wurde festgestellt, dass dieses Paket die Einstellungen in debconf nach der Erstinstallation ignoriert. Sie können debconf verwenden, um vor der Installation einen Pre-Seed durchzuführen. Nach der Installation überschreibt ldap-auth-config Ihre debconf-Einstellungen jedoch lieber mit den Einstellungen, die in den von ihm verwalteten Systemkonfigurationsdateien festgelegt sind. Das Paket pam-auth-config hat das gleiche Verhalten.

Der EDITOR / VISUAL-Mechanismus ist in diesem Fall ebenfalls schwierig zu verwenden, da ldap-auth-config ihn für verschiedene Fragensätze mehrmals aufruft. Dies kann mit einem Expect-Skript oder durch direktes Ändern der Systemkonfigurationsdateien einfacher erledigt werden. Es ist also nicht immer einfach, einen Rückfall zu vermeiden!

Ferg
quelle