Alimentation des valeurs d'entrée pour dpkg-reconfigure de manière non interactive

23

Je voudrais configurer le paquet ubuntu via dpkg-reconfigure avec toutes les valeurs fournies via le mode non interactif (dans le script).

En fait, mon cas est la configuration de Firebird ( http://www.firebirdsql.org/manual/ubusetup.html ), que lorsque vous utilisez la commande:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

me demande les 2 valeurs, où les réponses seraient «Y» et «newpwd».

L'échantillon de sortie ressemble à ceci:

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

J'ai essayé here stringsvia un script bash comme ceci:

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

Cependant, cela n'a pas fonctionné pour une raison quelconque et il a demandé que les valeurs soient fournies.

Des idées sur la façon de fournir les valeurs requises au script?

Peter Butkovic
la source

Réponses:

11

Vous pouvez toujours utiliser le langage attendu pour automatiser l'interaction avec un processus qui attend son entrée sur a tty. Je ne l'ai pas vraiment utilisé auparavant, je ne peux donc pas vraiment ajouter de code ici, mais le vôtre est un cas d'utilisation typique.

MISE À JOUR:

[Peter Butkovic] Je considère que je me dirige vers expectla bonne direction, ce script que j'ai terminé avec:

#!/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.
la source
merci de m'avoir indiqué la bonne direction. Je considère que cette réponse est correcte car c'était la solution facile à mettre en œuvre.
Peter Butkovic
Je me méfierais de la possibilité de problèmes d'i18n, mais pour un "usage domestique", cela semble sûr.
Jasen
20

Les paquets Debian utilisent debconf pour collecter les paramètres de temps d'installation. Debconf prend en charge plusieurs interfaces pour inviter l'utilisateur à saisir des valeurs. L' -foption pour dpkg-reconfiguresélectionner le frontend debconf à utiliser.

Le readlinefrontend est conçu pour une utilisation interactive. Ne l'utilisez pas dans un script automatique.

Si les valeurs par défaut sont correctes, utilisez simplement le noninteractivefrontend.

Si vous souhaitez fournir des valeurs différentes, vous avez deux options. Vous pouvez vous en tenir à l' noninteractiveinterface et préconfigurer la base de données debconf . La façon la plus simple de le faire est d'installer le paquet sur une machine et de le configurer de manière interactive, puis d'extraire les parties pertinentes de /var/cache/debconf/config.datet de fournir ce fichier à debconf:

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

Une autre méthode consiste à utiliser le editorfrontal et à définir la variable d'environnement VISUAL(ou EDITOR, mais VISUALa priorité sur EDITORsi elle est définie) dans un programme qui prend un fichier contenant les paramètres actuels comme argument et écrase ce fichier avec les paramètres souhaités.

Gilles 'SO- arrête d'être méchant'
la source
6
Pas besoin de /var/cache/debconf/config.datvous analyser . Vous pouvez utiliser à debconf-get-selectionspartir du debconf-utilspackage. Voir ceci par exemple.
Joseph R.
De plus, je ne sais pas si la préconfiguration est la bonne solution ici. Nous parlons de course à pied dpkg-reconfigure, ce que je suppose que l'OP veut automatiser parce qu'il le fera fréquemment.
Joseph R.
merci pour les indices. a décidé d'aller pour attendre le script. n'a pas enquêté plus en profondeur ici.
Peter Butkovic
2
@JosephR. En effet, debconf-get-selectionsest susceptible d'être utile ici. Si Peter veut le faire souvent avec des valeurs différentes, il doit générer config.datdynamiquement (c'est un format simple). C'est plus facile que expect. expectest le chemin du désespoir. Par exemple, il tombera en panne si une nouvelle version du package introduit une nouvelle question (ou bien vous avez besoin d'un script beaucoup plus sophistiqué).
Gilles 'SO- arrête d'être méchant'
@JosephR le lien sur le pré-ensemencement que vous avez publié ne fonctionne plus, essayez ceci: zacks.eu/debian-preseed
cjohnson318
13

Utilisez la debconf-set-selectionscommande pour insérer de nouvelles valeurs dans la base de données debconf ( /var/cache/debconf/config.dat).


La réponse d'Eli n'était pas claire pour moi, alors je vais l'expliquer étape par étape.

La première chose à faire est d'installer le package de manière interactive et d'obtenir les sélections choisies par (changez firebirdle nom de votre package):

sudo debconf-get-selections | grep ^firebird

ou:

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

Pré-amorcez ensuite la base de données debconf avec des réponses debconf-set-selections, par exemple:

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

où la syntaxe est:

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

Voici un autre exemple de ttf-mscorefonts-installerpackage:

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

Remarque: Les sélections d'entrée peuvent provenir de l'entrée standard ou du fichier.

Vérifiez: man debconf-set-selectionspour plus d'informations.


Une autre méthode consiste à utiliser Kickstart .

kenorb
la source
debconf-set-selections ne semble pas prendre effet dans tous les cas, par exemple: exim.
Jasen
1
debconf-set-selections n'exécute PAS le script de configuration intégré au paquet deb que vous modifiez. Il définit uniquement les sélections demandées par le package, qui ne sont que la première partie de celui-ci. dpkg-reconfigure exécute les deux parties.
fred
4

Je fouille depuis environ une heure en essayant de condenser la solution pour cela en une ligne et je l'ai finalement trouvée: debconf-set-selections

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

Cela forcera debconf à utiliser les valeurs par défaut et ne vous dérangera pas. Vous pouvez également définir les paramètres de configuration par défaut pour n'importe quel paquet Debian, consultez la page de manuel pour plus d'informations.

Eli
la source
N'est-ce pas la même chose que sudo dpkg-reconfigure debconf -f noninteractiveou export DEBIAN_FRONTEND=noninteractive?
kenorb
0

J'ai essayé de faire une reconfiguration scriptée des paramètres LDAP (package ldap-auth-config) en utilisant la méthode debconf-get-selections / set-selections mentionnée ci-dessus, pour constater que ce package ignore les paramètres de debconf après l'installation initiale. Vous pouvez utiliser debconf pour pré-amorcer avant l'installation, mais après l'installation, ldap-auth-config préfère écraser vos paramètres debconf avec tout ce qui est défini dans les fichiers de configuration système qu'il gère. Le paquet pam-auth-config a le même comportement.

Le mécanisme EDITOR / VISUAL est également difficile à utiliser dans ce cas car ldap-auth-config l'invoque plusieurs fois pour différents ensembles de questions. Il peut être manipulé plus facilement avec un script attendu, ou en modifiant directement les fichiers de configuration du système. Donc, il n'est pas toujours facile d'éviter de se replier sur ce qui est attendu!

Ferg
la source