如何回答所有互動式對話和非對話問題

如何回答所有互動式對話和非對話問題

我想在 ubuntu 18.04 上從 Node js 程式碼運行這個命令,所以我無法回答提示,我應該呼叫它一次

sudo apt-get install --install-推薦 linux-generic-hwe-18.04

透過下面的技巧我已經做到了

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

但後來我收到一個對話框問題,選擇了第二個選項,但我的答案是第一個選項,又名“安裝包維護者版本”,下面的技巧不起作用

┌─────────────────────────────────┤  ├─────────────────────────────────┐
│ 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' | '\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 apt-get install --install-推薦 linux-generic-hwe-18.04

我也嘗試過很多像下面這樣的方法,但它不起作用

sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

我多次遇到這類問題,例如關於 libssl 問題,請告訴我如何回答這類問題?我想在運行命令時首先回答所有問題

答案1

Dpkg 實際上確實提供了一種自動回答對話問題的方法,並且在預先安裝時非常流行(主要是 ubuntu 伺服器,儘管新安裝程式不支援),因為此類安裝程式往往有大量的選單和選單選項。

什麼是 debconf 檔案?


A德布會議(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-取得選擇(1),debconf-設定-選擇(1)

通常很難得出正確的完整選擇列表,一個很好的方法是先安裝一個包,將其選擇轉儲到文件中,編輯相關選擇並從文件中設定新選擇。您也可以透過管道將字串或檔案內容傳遞給 set 命令:

echo "some selection" |debconf-set-selections

理解 debconf 語法:


以下是兩個軟體包 debconf 選擇的範例,一個用於 lightdm(一個 ubuntu 顯示管理器),還有一些來自 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命令更新了作業系統中儲存的 debconf 資料庫。可以在安裝新軟體包之前設定一個選擇列表,並且將使用這些列表。對於已安裝的軟體包,無需清除。dpkg-reconfigure '<my_package_name>'應用新選擇後使用簡單。

您也可以定義 debconf 級別,只允許出現一些問題/確認提示並由您回答,或定義應詢問非關鍵問題:

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

可用等級有:低、中、高或嚴重。有關 debconf 的更多資訊請參閱此處:debianwiki/debconf。如果您想完全停用任何對話方塊(僅當您的選擇完全符合您的預期時才建議),請使用非互動式選項:dpkg-reconfigure --frontend Noninteractive '<package_name>'

答案2

如果您想以程式設計方式回答互動式程式的提示,您應該使用expect.安裝該expect軟體包並編寫一個運行程式並回答提示的腳本。腳本的整體版面如下:

#!/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需要一些練習,但是一旦你習慣了它,它就是一個非常有用的工具。

相關內容