ich möchte diesen Befehl auf Ubuntu 18.04 aus Node-JS-Code ausführen, daher kann ich nicht auf Eingabeaufforderungen antworten und muss ihn einmal aufrufen
sudo apt-get install --install-recommends linux-generic-hwe-18.04
mit dem folgenden Trick habe ich es geschafft
printf '\n' | sudo apt-get install --install-recommends linux-generic-hwe-18.04
aber dann bekomme ich eine Dialogfrage, ob die zweite Option ausgewählt ist, aber meine Antwort ist die erste Option, d. h. "Installieren Sie die Version des Paketbetreuers". Der folgende Trick funktioniert hier nicht
┌─────────────────────────────────┤ ├─────────────────────────────────┐
│ 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> │
│ │
└──────────────────────────────────────────────────────────────────────┘
keines der folgenden funktioniert
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
außerdem habe ich viele Methoden wie unten ausprobiert, aber es hat nicht funktioniert
sudo DEBIAN_FRONTEND=nichtinteraktiv apt-get -y -o Dpkg::Optionen::="--force-confdef" -o Dpkg::Optionen::="--force-confold" dist-upgrade
Ich stoße oft auf diese Art von Fragen, zum Beispiel bei Libssl-Fragen. Bitte sagen Sie mir, wie ich auf diese Art von Fragen antworten kann. Ich möchte zunächst alle Fragen beantworten, indem ich den Befehl ausführe
Antwort1
Dpkg bietet tatsächlich eine Methode zum Automatisieren der Beantwortung von Dialogfragen und ist beim Voreinstellen einer Installation sehr beliebt (meistens Ubuntu-Server, obwohl dies vom neuen Installationsprogramm nicht unterstützt wird), da solche Installationsprogramme dazu neigen, eine große Anzahl von Menüs und Menüoptionen zu haben.
Was ist eine Debconf-Datei?
Adebconf(Debian-Konfigurations-)Datei,auch bekannt als Seed-Dateiist eine Datei, die Parameter und Fragen des Installateurs (Wort für Wort, so wie sie sind) und unsere Antworten darauf auflistet. Wenn eine Frage fehlt oder mit einer nicht unterstützten Antwort beantwortet wird, wird (falls möglich) ein Standardwert gewählt.
Jedes Paket hat eineKonfigurationsliste, auch wenn während der Installation keine Fragen gestellt wurden und Standardwerte verwendet wurden. Wenn Sie ein Paket neu installieren und keine neuen Konfigurationen angeben, werden die bereits bekannten Konfigurationen verwendet. Notiz:Debconf-Dateien konfigurieren die Pakete nicht wirklich, sie enthalten lediglich eine Reihe von Fragen und Antwortwerten, die vom Installationsprogramm verwendet werden.
Wie können wir Debconf-Paketauswahlen anzeigen oder erstellen?
- Um alle für jedes installierte Paket getroffenen Auswahlen aufzulisten, verwenden Sie einfach
debconf-get-selections
. - Um ein bestimmtes Paket aufzulisten, verwenden Sie
debconf-get-selections |grep '<my_package_name>'
. - Um den Wert einer vorhandenen Antwort durch einen anderen Wert zu ersetzen oder neue Auswahlen aus der Befehlszeile hinzuzufügen, verwenden Sie
debconf-set-selections '<my_package_selection_stanza>'
. - Um Werte aus einer Datei zu ändern oder hinzuzufügen, verwenden Sie
debconf-set-selections '<my_file_location>'
.
Weitere Informationen finden Sie in den Manualpages:debconf-get-selections(1),debconf-set-selections(1).
Es ist normalerweise schwierig, die richtige vollständige Auswahlliste zu erstellen. Eine sehr gute Methode besteht darin, zuerst ein Paket zu installieren, seine Auswahl in eine Datei zu übertragen, die relevanten Auswahlen zu bearbeiten und die neuen Auswahlen aus der Datei festzulegen. Sie können auch eine Zeichenfolge oder einen Dateiinhalt an den Set-Befehl weiterleiten:
echo "some selection" |debconf-set-selections
Die Debconf-Syntax verstehen:
Dies ist ein Beispiel für zwei Debconf-Paketauswahlen, eine für Lightdm (ein Ubuntu-Displaymanager) und ein paar Strophen aus Grub-Auswahlen:
$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
Wie wir sehen, ist die Syntax sehr intuitiv: Der erste Teil ist der Paketname, gefolgt von einem '/' und einem Frage-/Konfigurationsnamen. Danach folgt eine Antwortmethode und eine Antwort.
Einfügen von Debconf-Auswahlen und Paketneukonfiguration
debconf-set-selections
Der Befehl aktualisiert die im Betriebssystem gespeicherte Debconf-Datenbank. Es ist möglich, vor der Installation neuer Pakete eine Auswahlliste festzulegen, die dann verwendet wird. Für bereits installierte Pakete ist keine Bereinigung erforderlich. Einfache Verwendung dpkg-reconfigure '<my_package_name>'
nach Anwendung der neuen Auswahl.
Sie können auch eine Debconf-Ebene definieren, die nur die Anzeige bestimmter Fragen/Bestätigungsaufforderungen und deren Beantwortung durch Sie zulässt, oder festlegen, dass nur kritische Fragen gestellt werden sollen:
dpkg-reconfigure -p '<level>' '<my_package_name>'
Verfügbare Stufen sind: niedrig, mittel, hoch oder kritisch. Weitere Informationen zu Debconf finden Sie hier:debianwiki/debconfWenn Sie alle Dialoge vollständig deaktivieren möchten (nur empfohlen, wenn Ihre Auswahl genau Ihren Vorstellungen entspricht), verwenden Sie die Option „Nicht interaktiv“: dpkg-reconfigure --frontend Noninteractive '<package_name>'
.
Antwort2
Wenn Sie programmgesteuert auf Eingabeaufforderungen eines interaktiven Programms antworten möchten, sollten Sie verwenden expect
. Installieren Sie das expect
Paket und schreiben Sie ein Skript, das Ihr Programm ausführt und Eingabeaufforderungen beantwortet. Der allgemeine Aufbau des Skripts sieht wie folgt aus:
#!/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
Die korrekte Verwendung von expect erfordert etwas Übung, aber wenn Sie sich erst einmal daran gewöhnt haben, ist es ein äußerst nützliches Tool.