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