Memberi makan nilai input ke dpkg-mengkonfigurasi ulang dengan cara yang tidak interaktif

23

Saya ingin mengonfigurasi paket ubuntu melalui dpkg-reconfigure dengan semua nilai yang disediakan melalui mode non-interaktif (dalam skrip).

Sebenarnya kasus saya adalah konfigurasi firebird ( http://www.firebirdsql.org/manual/ubusetup.html ), yang ketika menggunakan perintah:

sudo dpkg-reconfigure firebird2.5-superclassic -freadline

meminta saya untuk 2 nilai, di mana jawabannya adalah 'Y' dan 'newpwd'.

Output sampel terlihat seperti ini:

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

Saya sudah mencoba here stringsmelalui skrip bash seperti ini:

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

Namun ini tidak berhasil karena suatu alasan dan meminta nilai yang diberikan.

Adakah ide bagaimana memberi nilai pada skrip?

Peter Butkovic
sumber

Jawaban:

11

Anda selalu dapat menggunakan bahasa harapan untuk mengotomatisasi interaksi dengan proses yang mengharapkan inputnya pada a tty. Saya belum pernah menggunakannya sebelumnya jadi saya tidak bisa menambahkan kode di sini, tetapi milik Anda adalah kasus penggunaan biasa.

MEMPERBARUI:

[Peter Butkovic] Saya menganggap menunjuk saya ke expectarah yang benar, naskah ini saya akhiri dengan:

#!/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.
sumber
terima kasih telah menunjukkan saya arah yang benar. Saya menganggap jawaban ini benar karena itu adalah solusi yang mudah diterapkan.
Peter Butkovic
Saya akan mewaspadai kemungkinan masalah i18n, tetapi untuk "penggunaan di rumah" ini tampaknya aman.
Jasen
20

Paket Debian menggunakan debconf untuk mengumpulkan pengaturan waktu instalasi. Debconf mendukung banyak frontend untuk meminta nilai pada pengguna. The -fpilihan untuk dpkg-reconfiguremenyeleksi yang Debconf frontend untuk digunakan.

The readlinefrontend dirancang untuk digunakan interaktif. Jangan menggunakannya dalam skrip otomatis.

Jika nilai default baik-baik saja, maka cukup gunakan noninteractivefrontend.

Jika Anda ingin memberikan nilai yang berbeda, Anda memiliki dua opsi. Anda dapat tetap menggunakan noninteractivefrontend, dan preseed database debconf . Cara termudah untuk melakukan ini adalah menginstal paket pada satu mesin dan mengkonfigurasinya secara interaktif, lalu ekstrak bagian-bagian yang relevan dari /var/cache/debconf/config.datdan berikan file ini ke debconf:

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

Metode lain adalah dengan menggunakan editorfrontend, dan mengatur variabel lingkungan VISUAL(atau EDITOR, tetapi VISUALlebih diutamakan EDITORjika diatur) ke program yang mengambil file yang berisi pengaturan saat ini sebagai argumen, dan menimpa file itu dengan pengaturan yang Anda inginkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6
Tidak perlu mengurai /var/cache/debconf/config.datsendiri. Anda dapat menggunakan debconf-get-selectionsdari debconf-utilspaket. Lihat ini misalnya.
Joseph R.
Juga, saya tidak yakin apakah preseeding cocok di sini. Kita berbicara tentang menjalankan dpkg-reconfigure, yang saya kira OP ingin mengotomatisasi karena dia akan sering melakukannya.
Joseph R.
terima kasih atas petunjuknya. memutuskan untuk pergi untuk skrip ekspektasi. tidak menyelidiki lebih dalam di sini.
Peter Butkovic
2
@ JosephephR. Memang, debconf-get-selectionskemungkinan akan berguna di sini. Jika Peter ingin sering melakukan ini dengan nilai yang berbeda, ia harus menghasilkan secara config.datdinamis (ini adalah format sederhana). Ini lebih mudah daripada expect. expectadalah jalan putus asa. Sebagai contoh, itu akan rusak jika versi baru dari paket memperkenalkan pertanyaan baru (atau Anda memerlukan skrip yang jauh lebih canggih).
Gilles 'SANGAT berhenti menjadi jahat'
@JosephR tautan tentang pra-penyemaian yang Anda kirim tidak lagi berfungsi, coba ini: zacks.eu/debian-preseed
cjohnson318
13

Gunakan debconf-set-selectionsperintah untuk memasukkan nilai-nilai baru ke dalam database debconf ( /var/cache/debconf/config.dat).


Jawaban Eli tidak jelas bagi saya, jadi saya akan menjelaskannya langkah demi langkah.

Hal pertama yang harus dilakukan adalah menginstal paket secara interaktif dan mendapatkan pilihan yang dipilih dengan (ubah firebirdke nama paket Anda):

sudo debconf-get-selections | grep ^firebird

atau:

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

Kemudian pra-seed database debconf dengan jawaban oleh debconf-set-selections, misalnya:

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

di mana sintaks:

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

Berikut ini contoh lain untuk ttf-mscorefonts-installerpaket:

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

Catatan: Pilihan input dapat dari input standar atau file.

Periksa: man debconf-set-selectionsuntuk info lebih lanjut.


Cara alternatif adalah dengan menggunakan Kickstart .

kenorb
sumber
debconf-set-selection tampaknya tidak berpengaruh dalam semua kasus, misalnya: exim.
Jasen
1
debconf-set-choices TIDAK menjalankan skrip konfigurasi yang dibangun ke dalam paket deb yang Anda ubah. Itu hanya menetapkan pilihan yang diminta paket yang hanya merupakan bagian pertama saja. dpkg-reconfigure menjalankan kedua bagian.
fred
4

Saya telah mengaduk-aduk sekitar satu jam hanya mencoba untuk menyingkat solusi untuk ini menjadi satu-liner dan akhirnya saya menemukannya: debconf-set-choices

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

Ini akan memaksa debconf untuk menggunakan default dan tidak mengganggu Anda. Anda juga dapat mengatur default konfigurasi untuk setiap paket Debian, lihat halaman manual untuk info lebih lanjut.

Eli
sumber
Tidak sama dengan sudo dpkg-reconfigure debconf -f noninteractiveatau export DEBIAN_FRONTEND=noninteractive?
kenorb
0

Saya telah mencoba melakukan konfigurasi ulang pengaturan LDAP (paket ldap-auth-config) menggunakan metode debconf-get-choices / set-seleksi yang disebutkan di atas, hanya untuk menemukan bahwa paket ini mengabaikan pengaturan dalam debconf setelah instalasi awal. Anda dapat menggunakan debconf untuk melakukan pre-seed sebelum menginstal, tetapi setelah menginstal ldap-auth-config lebih memilih untuk menimpa pengaturan debconf Anda dengan apa pun yang diatur dalam file konfigurasi sistem yang dikelolanya. Paket pam-auth-config memiliki perilaku yang sama.

Mekanisme EDITOR / VISUAL juga sulit digunakan dalam kasus ini karena ldap-auth-config memanggilnya beberapa kali untuk set pertanyaan yang berbeda. Ini dapat ditangani dengan lebih mudah dengan skrip harapan, atau dengan secara langsung memodifikasi file konfigurasi sistem. Jadi, tidak selalu mudah untuk menghindari jatuh kembali ke yang diharapkan!

Ferg
sumber