すべての対話型ダイアログと非対話型質問にどのように答えるか

すべての対話型ダイアログと非対話型質問にどのように答えるか

このコマンドをNode.jsコードからUbuntu 18.04で実行したいのですが、プロンプトに答えることができず、一度呼び出す必要があります。

sudo apt-get install --install-recommends linux-generic-hwe-18.04

以下のトリックで私はそれをやった

printf '\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04

しかし、2番目のオプションが選択されているというダイアログの質問が表示されますが、私の答えは最初のオプション、つまり「パッケージメンテナーのバージョンをインストールする」です。以下のトリックは機能しません。

┌─────────────────────────────────┤  ├─────────────────────────────────┐
│ A new version of /boot/grub/menu.lst is available, but the version   │
│ installed currently has been locally modified.                       │
│                                                                      │
│ What would you like to do about menu.lst?                            │
│                                                                      │
│     install the package maintainer's version                         │
│     keep the local version currently installed                       │
│     show the differences between the versions                        │
│     show a side-by-side difference between the versions              │
│     show a 3-way difference between available versions               │
│     do a 3-way merge between available versions (experimental)       │
│     start a new shell to examine the situation                       │
│                                                                      │
│                                                                      │
│                                <Ok>                                  │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

以下のどれも機能しません

printf '\n1\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04 printf '\n\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04

また、以下のような多くの方法を試しましたが、うまくいきませんでした

sudo DEBIAN_FRONTEND=非対話型 apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

私はこのような質問に何度も遭遇しています。例えば、libsslの質問などです。このような質問にどう答えたらよいか教えてください。まずコマンドを実行する前に、すべての質問に答えたいのです。

答え1

Dpkg は実際にダイアログの質問への回答を自動化する方法を提供しており、インストールの事前シード時に非常に人気があります (主に Ubuntu サーバーですが、新しいインストーラーではサポートされていません)。これは、インストーラーが大量のメニューとメニュー オプションを持つ傾向があるためです。

debconf ファイルとは何ですか?


デブコン(Debian 設定) ファイル、シードファイルとも呼ばれるは、インストーラーによって尋ねられるパラメータと質問 (単語ごとにそのまま) およびそれに対する回答をリストしたファイルです。質問が欠落しているか、サポートされていない回答で回答されている場合は、デフォルト値が選択されます (可能な場合)。

すべてのパッケージには構成リストインストールのプロセスで質問されず、デフォルト値が使用された場合でも、パッケージを再インストールし、新しい構成を指定しない場合は、マシンに既に知られている構成が使用されます。 注記:debconf ファイルは実際にはパッケージを構成するものではなく、インストーラーが使用する一連の質問と回答の値を保持するだけです。

パッケージ debconf 選択を表示または作成するにはどうすればよいでしょうか?


  • インストールされている各パッケージに対して行われたすべての選択を一覧表示するには、 を使用しますdebconf-get-selections
  • 特定のパッケージを一覧表示するには、 を使用しますdebconf-get-selections |grep '<my_package_name>'
  • 既存の回答の値を別の値に変更したり、コマンド ラインから新しい選択を追加したりするには、 を使用しますdebconf-set-selections '<my_package_selection_stanza>'
  • ファイルから値を変更または追加するには、 を使用しますdebconf-set-selections '<my_file_location>'

詳細についてはマニュアルページを参照してください。debconf-get-selections(1)debconf-set-selections(1)

通常、正しい完全な選択リストを作成するのは難しいため、最初にパッケージをインストールし、その選択内容をファイルにダンプし、関連する選択内容を編集して、ファイルから新しい選択内容を設定するのが、非常に良い方法です。文字列またはファイルの内容を set コマンドにパイプすることもできます。

echo "some selection" |debconf-set-selections

debconf 構文を理解する:


以下は、debconf の 2 つのパッケージ選択の例です。1 つは lightdm (Ubuntu ディスプレイ マネージャー) 用で、もう 1 つは grub 選択からのいくつかのスタンザです。

$debconf-get-selections |grep lightdm
lightdm shared/default-x-display-manager   select   lightdm
lightdm lightdm/daemon_name   string   /usr/sbin/lightdm

$debconf-get-selections |grep grub-pc
grub-pc grub-pc/chainload_from_menu.list boolean true
grub-pc grub-pc/timeout string 10
grub-pc grub-pc/install_devices multiselect

ご覧のとおり、構文は非常に直感的です。最初の部分はパッケージ名で、その後に「/」と質問/構成名が続きます。その後に回答方法と回答が続きます。

debconfの選択とパッケージの再構成の挿入


debconf-set-selectionsコマンドは、OS に保存されている debconf データベースを更新しました。新しいパッケージをインストールする前に選択リストを設定することができ、それらが使用されます。すでにインストールされているパッケージについては、パージする必要はありません。dpkg-reconfigure '<my_package_name>'新しい選択を適用した後は簡単に使用できます。

また、debconf レベルを定義して、いくつかの質問や確認プロンプトのみを表示して回答できるようにしたり、重要ではないが質問されるように定義したりすることもできます。

dpkg-reconfigure -p '<level>' '<my_package_name>'

使用可能なレベルは、低、中、高、または重大です。debconf の詳細については、こちらをご覧ください。debianwiki/debconfダイアログを完全に無効にしたい場合 (選択内容が意図したとおりに一致する場合にのみ推奨) は、非対話型オプションを使用しますdpkg-reconfigure --frontend Noninteractive '<package_name>'

答え2

対話型プログラムからのプロンプトにプログラム的に応答したい場合は、 を使用する必要がありますexpectexpectパッケージをインストールし、プログラムを実行してプロンプトに応答するスクリプトを作成します。スクリプトの一般的なレイアウトは次のようになります。

#!/usr/bin/expect

spawn <command_to_run>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
expect <something_that_should_appear_on_screen>
send <keys_that_should_be_sent_to_program>
...
expect <something_that_should_appear_at_the_very_end>
exit

expect を正しく使用するにはある程度の練習が必要ですが、慣れてしまえば非常に便利なツールになります。

関連情報