Alimentando valores de entrada para o dpkg-reconfigure de uma maneira não interativa

23

Gostaria de configurar o pacote ubuntu via dpkg-reconfigure com todos os valores fornecidos pelo modo não interativo (no script).

Na verdade, meu caso é a configuração do firebird ( http://www.firebirdsql.org/manual/ubusetup.html ), que ao usar o comando:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

pergunta-me os 2 valores, onde as respostas seriam 'Y' e 'newpwd'.

A saída de amostra é assim:

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

Eu tentei here stringsvia script bash como este:

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

No entanto, isso não funcionou por algum motivo e solicitou que os valores fossem fornecidos.

Alguma idéia de como alimentar os valores necessários para o script?

Peter Butkovic
fonte

Respostas:

11

Você sempre pode usar a linguagem de espera para automatizar a interação com um processo que espera sua entrada em um tty. Eu realmente não o usei antes, então não posso adicionar código aqui, mas o seu é um caso de uso típico.

ATUALIZAR:

[Peter Butkovic] Considero apontar-me expectcomo uma direção certa, neste script que terminei com:

#!/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.
fonte
obrigado por me indicar a direção certa. Considero esta resposta tão correta quanto a mais fácil de implementar.
Peter Butkovic
Eu desconfiaria da possibilidade de problemas do i18n, mas para "uso doméstico" isso parece seguro.
Jasen
20

Pacotes Debian usam o debconf para coletar configurações de tempo de instalação. O Debconf suporta múltiplos frontends para solicitar valores ao usuário. A -fopção para dpkg-reconfigureselecionar qual front-end do debconf usar.

O readlinefront-end foi projetado para uso interativo. Não o use em um script automático.

Se os valores padrão estiverem corretos, basta usar o noninteractivefrontend.

Se você deseja fornecer valores diferentes, você tem duas opções. Você pode ficar com o noninteractivefrontend e pré-configurar o banco de dados debconf . A maneira mais fácil de fazer isso é instalar o pacote em uma máquina e configurá-lo interativamente, depois extrair as partes relevantes /var/cache/debconf/config.date fornecer esse arquivo ao debconf:

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

Outro método é usar o editorfrontend e definir a variável de ambiente VISUAL(ou EDITOR, mas VISUALtem precedência sobre EDITORse estiver definida) como um programa que utiliza um arquivo que contém as configurações atuais como argumento e sobrescreve esse arquivo pelas configurações desejadas.

Gilles 'SO- parar de ser mau'
fonte
6
Não há necessidade de se analisar /var/cache/debconf/config.dat. Você pode usar debconf-get-selectionso debconf-utilspacote. Veja isto por exemplo.
Joseph R.
Além disso, não tenho certeza se preseeding é o ajuste certo aqui. Estamos falando de corrida dpkg-reconfigure, o que eu acho que o OP quer automatizar porque ele fará isso com frequência.
Joseph R.
obrigado pelas dicas. decidiu ir para o script de espera. não investigou mais fundo aqui.
22613 Peter Butkovic
2
@JosephR. Na verdade, debconf-get-selectionsé provável que seja útil aqui. Se Peter quiser fazer isso frequentemente com valores diferentes, ele deve gerar config.datdinamicamente (é um formato simples). Isso é mais fácil que expect. expecté o caminho do desespero. Por exemplo, ele será quebrado se uma nova versão do pacote apresentar uma nova pergunta (ou você precisará de um script muito mais sofisticado).
Gilles 'SO- stop be evil'
@JosephR o link sobre pré-semeadura você postou já não funciona, tente o seguinte: zacks.eu/debian-preseed
cjohnson318
13

Use o debconf-set-selectionscomando para inserir novos valores no banco de dados debconf ( /var/cache/debconf/config.dat).


A resposta de Eli não estava clara para mim, então vou explicar passo a passo.

A primeira coisa a fazer é instalar o pacote interativamente e obter as seleções escolhidas por (mude firebirdpara o nome do seu pacote):

sudo debconf-get-selections | grep ^firebird

ou:

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

Em seguida, pré-propague o banco de dados debconf com respostas debconf-set-selections, por exemplo:

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

onde a sintaxe é:

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

Aqui está outro exemplo de ttf-mscorefonts-installerpacote:

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

Nota: As seleções de entrada podem ser da entrada padrão ou do arquivo.

Verifique: man debconf-set-selectionspara mais informações.


Uma maneira alternativa é usar o Kickstart .

kenorb
fonte
O debconf-set-selections parece não ter efeito em todos os casos, por exemplo: exim.
Jasen
1
debconf-set-selections NÃO executa o script de configuração embutido no pacote deb que você está mudando. Ele define apenas as seleções que o pacote está solicitando, que é apenas a primeira parte dele. O dpkg-reconfigure executa as duas partes.
fred
4

Estou bisbilhotando há cerca de uma hora tentando condensar a solução para isso em uma única linha e finalmente a encontrei: debconf-set-selections

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

Isso forçará o debconf a usar os padrões e não incomodá-lo. Você também pode definir os padrões de configuração para qualquer pacote Debian, consulte a página de manual para mais informações.

Eli
fonte
Não é o mesmo que sudo dpkg-reconfigure debconf -f noninteractiveou export DEBIAN_FRONTEND=noninteractive?
Kenorb
0

Eu tenho tentado fazer a reconfiguração com script das configurações LDAP (pacote ldap-auth-config) usando o método debconf-get-selections / set-selections mencionado acima, apenas para descobrir que este pacote ignora as configurações no debconf após a instalação inicial. Você pode usar o debconf para pré-propagar antes da instalação, mas após a instalação, o ldap-auth-config prefere sobrescrever suas configurações do debconf pelo que estiver definido nos arquivos de configuração do sistema que gerencia. O pacote pam-auth-config tem o mesmo comportamento.

O mecanismo EDITOR / VISUAL também é difícil de usar neste caso, porque o ldap-auth-config o invoca várias vezes para diferentes conjuntos de perguntas. Ele pode ser tratado mais facilmente com um script de expectativa ou modificando diretamente os arquivos de configuração do sistema. Portanto, nem sempre é fácil evitar voltar a esperar!

Ferg
fonte