Wie kann ich eine Konfigurationsdatei auf die ursprünglich installierte Version zurücksetzen, nachdem ich sie bearbeitet habe?

24

Ich möchte eine Datei in /etc/der ursprünglich installierten Form wiederherstellen. Ich habe die Datei seit der Installation bearbeitet. Wie kann ich diese Konfigurationsdatei wiederherstellen? Apt ist klug genug , um bearbeitete Konfigurationsdateien nicht zu überschreiben. Wie kann ich also sagen, dass ich das möchte ?

Nehmen wir als Argument an, ich möchte die Datei /etc/foo.confaus dem Paket zurücksetzen foo.

Ryan C. Thompson
quelle
2
Für alle, die vorschlagen , Spülen und Neuinstallation foo, was passiert , wenn barhängt davon ab , foound ich will nicht entfernen bar?
Ryan C. Thompson

Antworten:

15

Die Antwort von Ryan Thomson war auf dem richtigen Weg. Trotzdem wäre es nicht in der Lage, die Arbeit zu erledigen (der detaillierte Grund ist unten angegeben).

Die korrekte (und einfachste) Weg , dies zu tun , wird unter Verwendung von -omit aptdpkg Option passieren und zwingen dpkgSie zu fragen , ob Sie die geänderten Konfigurationsdateien oder die ursprünglichen beibehalten möchten. Der Befehl wird so sein -

sudo apt-get --reinstall -o Dpkg::Options::="--force-confask" install foo

Dies würde Ihnen eine Frage stellen wie

Configuration file '/etc/foo/foo.conf'
 ==> Modified (by you or by a script) since installation.
     Version in package is the same as at last installation.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** foo.conf (Y/I/N/O/D/Z) [default=N] ? 

Sie müssen entweder Y oder I drücken , um die ursprüngliche Konfigurationsdatei des Paketverwalters zu installieren. Sie können sogar D drücken, um die Änderungen zu sehen, oder eine Root-Shell mit der Option Z starten, um sich selbst zu reparieren.

Hinweis: Nach dem Ersetzen finden Sie Ihre geänderte Datei alsat /etc/foo/foo.conf.dpkg-old


Warum würden andere Optionen nicht funktionieren?

Weil die anderen Optionen in dpkg nicht gut funktionieren. Die Optionen, die sich mit den Konfigurationsdateien eines Pakets befassen, sind:

  • --force-confmiss
  • --force-confnew
  • --force-confold
  • --force-confdef

--force-confmisswürde nicht funktionieren, wenn sich die Paketversion nicht ändert. Aus der Manpage

Wenn eine Conffile geändert wurde und sich die Version im Paket geändert hat, installieren Sie die neue Version immer ohne Aufforderung, sofern nicht auch --force-confdef angegeben ist. In diesem Fall wird die Standardaktion bevorzugt.

--force-confmissfunktioniert mit fehlenden Conffiles. Es wird auch fehlschlagen, wenn die Version nicht geändert wurde. Zitierende Manpage

confmiss: Wenn eine Conffile fehlt und sich die Version im Paket geändert hat, installieren Sie die fehlende Conffile immer ohne Aufforderung. Dies ist gefährlich, da dadurch eine an der Datei vorgenommene Änderung (Entfernung) nicht beibehalten wird

--force-confoldbehält die geänderte Version nur bei, wenn die Version geändert wird . Für dasselbe Paket wird es auch fehlschlagen. Zitierende Manpage

confold: Wenn eine Conffile geändert wurde und sich die Version im Paket geändert hat, behalten Sie immer die alte Version bei, ohne dazu aufgefordert zu werden , es sei denn, --force-confdef ist ebenfalls angegeben. In diesem Fall wird die Standardaktion bevorzugt.

--force-confdefscheitert auch , weil die Standard - Aktion ist ältere Datei zu behalten (angezeigt von der Meldung angezeigt mit --force-confask. Es Linie hat , (Y/I/N/O/D/Z) [default=N]das Haltemittel Standard. Siehe oben). Und wenn --force-confnewangegeben, aber die Version nicht geändert wird, funktioniert das auch nicht. Zitierende Manpage

confdef: Wenn eine Conffile geändert wurde und sich die Version im Paket geändert hat, wählen Sie immer die Standardaktion, ohne dazu aufgefordert zu werden. Wenn es keine Standardaktion gibt, wird der Benutzer nicht mehr gefragt, es sei denn, --force-confnew oder --force-confold wurden ebenfalls angegeben. In diesem Fall entscheidet er anhand dieser Aktion über die endgültige Aktion.

Nur --force-confaskfunktioniert, weil es Ihnen die Frage explizit stellt, auch wenn die Version identisch ist. Zitierende Manpage

confask: Wenn eine Conffile geändert wurde, bieten Sie immer an, sie durch die Version im Paket zu ersetzen, auch wenn sich die Version im Paket nicht geändert hat (seit dpkg 1.15.8). Wenn auch --force-confmiss , --force-confnew , --force-confold oder --force-confdef angegeben ist, wird die endgültige Aktion festgelegt.

Hoffe das wird helfen.

Anwar
quelle
Ihre Antwort war sehr umfassend, danke. Kann die Frage auch automatisch mit "y" beantwortet werden, also effektiv --force-confnew? Ich habe es versucht apt-get […] -y, aber das hat nicht funktioniert. (Wenn es nicht möglich ist, ändern Sie bitte auch die Antwort, um dies zu sagen.)
Tim Landscheidt
@ TimLandscheidt du fragst ob es möglich ist --force-confnewohne zu fragen zu benutzen ? Ich denke, das ist der Standardfall, was bedeutet, dass Ihre Änderungen beibehalten werden. --force-confaskstellt aptimmer die Frage, ansonsten würden Sie andere Optionen verwenden, wenn Sie die Antwort bereits kennen.
Anwar
1
Ha, ich hatte es -o Dpkg::Options::=--force-confnewerfolglos versucht (wie von Ihrer Antwort vorhergesagt) und die Fehlermeldung nicht gelesen, als ich es versuchte -o Dpkg::Options::="--force-confask --force-confnew". Die apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packageÄnderungskonfigurationsdateien von wurden jedoch korrekt überschrieben $package. Vielen Dank!
Tim Landscheidt
12

Wenn der Schaden bereits angerichtet wurde, können Sie über die Befehlszeile die offizielle Version der Konfigurationsdatei wiederherstellen. Laden Sie zuerst die Paketdatei herunter (entweder mit apt-get --download-onlyder unten angegebenen Version oder von der Paketseite unter packages.ubuntu.com ) und extrahieren Sie dann den Inhalt an einem temporären Speicherort. Sie können die Datei dann in kopieren /etc. Stellen Sie sicher, dass Sie die ursprünglichen Berechtigungen einhalten (die meisten Dateien in /etcbesitzen root und mode 644 (dh wortlesbar und root-schreibbar), aber jede Ausnahme gibt es aus einem wichtigen Grund).

sudo apt-get --download-only --reinstall install foo
mkdir /tmp/foo
dpkg-deb -x /var/cache/apt/archives/foo_VERSION_ARCH.deb /tmp/foo

Beachten Sie, dass dies nicht für Konfigurationsdateien gilt, die nicht aus einem Paket stammen, z. B. /etc/fstaboder /etc/passwd. Wenn Sie diese verlieren, sind Sie auf sich allein gestellt. (Die meisten sind sowieso sehr systemabhängig.)


Für die Zukunft empfehle ich die Verwendung von etckeeper Installieren Sie etckeeper . Installieren Sie das Paket und führen Sie es aus sudo etckeeper init. Hiermit wird die Versionskontrolle für alle Dateien in eingerichtet /etc. Sie müssen nichts weiter tun, um etckeeper zu verwalten. Sie müssen nur dann damit interagieren, wenn Sie eine Versionskontrolle durchführen möchten, z. B. indem Sie auf ältere Dateien verweisen. Dateien werden automatisch vor und nach jedem Lauf von apt und jede Nacht festgeschrieben (dies ist konfigurierbar).

Standardmäßig verwendet etckeeper unter Ubuntu Bazaar . Ändern Sie die Einstellung /etc/etckeeper/etckeeper.confvor dem Ausführen, etckeeper initwenn Sie Darcs, Git oder Mercury bevorzugen.

Mit Bazaar können Sie zur /etc/foo.confletzten festgeschriebenen Version zurückkehren:

cd /etc
sudo bzr revert foo.conf

Wenn Sie in der Zeit zurückgehen möchten, zeigen Sie sudo bzr log foo.confmit den Verlauf der Datei an, und sudo bzr revert -r 42 foo.confwenn Sie festgelegt haben, dass dies revno: 42die Version ist, zu der Sie zurückkehren möchten.

Gilles 'SO - hör auf böse zu sein'
quelle
7

Sie können das Paket manuell von packages.ubuntu.com herunterladen , die Datei extrahieren und Ihre Version durch diese ersetzen.

Oder Sie könnten:

sudo rm /etc/foo.conf # just for good measure
sudo apt-get --purge --reinstall install foo

Die zweite fühlt sich viel brutaler an. Möglicherweise werden auch andere Konfigurationen gelöscht, wenn mehr als eine Datei verwendet wird. Das erste ist mehr Klicken und Anstrengung, aber es scheint viel sicherer.

Zum zweiten können Sie die Datei möglicherweise einfach löschen und --reinstall ersetzt sie möglicherweise. Wenn ja, wäre das sicherer.

Oli
quelle
2
Nein, das Löschen einer Konfigurationsdatei wird als gültige Änderung betrachtet und von apt beibehalten.
Ryan C. Thompson
Ist es möglich, ein Paket zu löschen und neu zu installieren, wenn andere installierte Pakete davon abhängen?
Ryan C. Thompson
@ RyanThompson Ja, apt-get --reinstall purge packagewird nicht die Angehörigen verletzen.
Oli
Leider klappt es nicht.
Anwar
1

Je nach Paket finden Sie möglicherweise eine Standardkonfigurationsdatei in /usr/share/doc/foo/examples.

Herrben
quelle
0

Verwenden Sie Synaptic (Ubuntu Tweak ist noch praktischer, aber Synaptic ist einfacher) und wählen Sie "Paket vollständig entfernen". Dadurch werden alle Konfigurationsdateien gelöscht (möglicherweise möchten Sie diese Dateien sichern!).

Dann neu installieren. Sie sind fertig.

Mit Ubuntu Tweak erhalten Sie noch mehr Optionen für Bereinigungs-, Rerolling- und Konfigurations-Backups. Vielleicht möchten Sie es mal sehen. Es ist im Softwarecenter.

ps: Synaptic verwendet auch die Option "Löschen" (wie oben von Oli erwähnt ...) - nur mit einer grafischen Benutzeroberfläche für eine komfortablere Handhabung.

piedro
quelle
Welches Paket entfernt Dateien in Ihrem Home-Verzeichnis, wenn Sie es entfernen? Ich würde das als schwerwiegenden Fehler betrachten!
Gilles 'SO- hör auf böse zu sein'
@ Gilles: Du hast recht. Die persönlichen Einstellungen in Ihrem Home-Verzeichnis werden von der Bereinigung nicht berührt. Ich habe das oben Gesagte bearbeitet und korrigiert. sry
piedro
Das Löschen des Pakets ist möglicherweise keine Option, wenn andere davon abhängen.
Ryan C. Thompson
0

Endlich fand ich die Antwort, an die ich mich vor Jahren vage erinnerte:

dpkg --force-confnew --force-confmiss -i PACKAGE.deb

Das Argument "confnew" zwingt dpkg, geänderte Konfigurationsdateien durch die vom Paket bereitgestellten zu ersetzen, und das Argument "confmiss" gilt ebenfalls für gelöschte Konfigurationsdateien.

Laut diesem Chatlog können Sie diese Optionen auch über apt-get auf folgende Weise verwenden:

apt-get -o DPkg::Options::="--force-confnew --force-confmiss" --reinstall install PACKAGE

Das erspart Ihnen, die deb-Datei selbst zu finden.

Offensichtlich sind diese Optionen gefährlich und können bei Missbrauch wichtige Systemkonfigurationsdateien in die Luft jagen.

Ryan C. Thompson
quelle
Das Problem --force-confnewist, dass neue Konfigurationsdateien nur installiert werden, wenn die Version geändert wird. Wenn Sie dieselbe Version erneut installieren, wird die neue Konfigurationsdatei nicht installiert, da ich sie explizit getestet habe
Anwar,
Und --force-confmissinstalliert nur dann eine neue Konfigurationsdatei, wenn die Version geändert wurde und die Konfiguration fehlt. Wie in der Manpageconfmiss: If a conffile is missing and the version in the package did change, always install the missing conffile without prompting. This is dangerous, since it means not preserving a change (removing) made to the file.
Anwar