Jak mogę przywrócić plik konfiguracyjny z powrotem do pierwotnie zainstalowanej wersji po jego edycji?

24

Chcę przywrócić plik z /etc/powrotem do pierwotnie zainstalowanej postaci. Plik był edytowany od momentu jego zainstalowania. Jak mogę przywrócić ten plik konfiguracyjny? Apt jest wystarczająco inteligentny, aby nie zastępować edytowanych plików konfiguracyjnych, więc jak mam to powiedzieć, że chcę to zrobić?

Na wszelki wypadek powiedzmy, że chcę przywrócić plik /etc/foo.confz pakietu foo.

Ryan C. Thompson
źródło
2
Dla wszystkich, którzy sugerują czyszczenie i ponowną instalację foo, co jeśli barzależy od, fooa nie chcę usunąć bar?
Ryan C. Thompson,

Odpowiedzi:

15

Odpowiedź udzielona przez Ryana Thomsona zmierza w dobrym kierunku. Nadal nie byłby w stanie wykonać zadania (powód szczegółowy podano poniżej).

Prawidłowym (i najłatwiejszym) sposobem jest użycie opcji -oz, aptaby przekazać opcję dpkg i zmusić dpkgdo pytania, czy chcesz zachować zmodyfikowane pliki konfiguracyjne, czy oryginalne. Polecenie będzie takie -

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

To zada ci pytanie takie jak

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] ? 

Musisz nacisnąć klawisz Y lub I, aby zainstalować oryginalny plik konfiguracyjny opiekuna pakietu. Możesz nawet nacisnąć D, aby zobaczyć, jakie zmiany lub uruchomić powłokę główną z opcją Z, aby to naprawić.

Uwaga: po zamianie znajdziesz zmodyfikowany plik jakoat /etc/foo/foo.conf.dpkg-old


Dlaczego inne opcje nie działają?

Ponieważ inne opcje w dpkg nie działają dobrze. Dostępne są opcje dotyczące plików konfiguracyjnych pakietu

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

--force-confmissnie będzie działać, gdy wersja pakietu się nie zmieni. Ze strony podręcznika

Jeśli plik konfiguracyjny został zmodyfikowany, a wersja w pakiecie uległa zmianie, zawsze instaluj nową wersję bez monitowania, chyba że podano również opcję --force-confdef , w którym to przypadku preferowane jest działanie domyślne.

--force-confmisswspółpracuje z brakującymi plikami Conffiles. On również zawiedzie, gdy wersja się nie zmieni. Cytując stronę podręcznika

confmiss: Jeśli brakuje pliku i wersja w pakiecie uległa zmianie, zawsze instaluj brakujący plik bez monitowania. Jest to niebezpieczne, ponieważ oznacza to niezachowanie zmiany (usunięcia) dokonanej w pliku

--force-confoldzachowa zmodyfikowaną wersję tylko w przypadku zmiany wersji . W przypadku tego samego pakietu również się nie powiedzie. Cytując stronę podręcznika

confold: Jeśli plik konfiguracyjny został zmodyfikowany, a wersja w pakiecie uległa zmianie, zawsze zachowuj starą wersję bez monitowania, chyba że podano również opcję --force-confdef , w takim przypadku preferowana jest akcja domyślna.

--force-confdefrównież się nie powiedzie, ponieważ domyślną akcją jest zachowanie starszego pliku (wskazany w komunikacie pokazanym za pomocą --force-confask. Ma linię, (Y/I/N/O/D/Z) [default=N]co oznacza, że ​​zachowanie jest domyślne. Patrz wyżej). A jeśli --force-confnewjest określony, ale wersja się nie zmienia, to też nie będzie działać. Cytując stronę podręcznika

confdef: Jeśli plik konfiguracyjny został zmodyfikowany, a wersja w pakiecie uległa zmianie, zawsze wybieraj akcję domyślną bez monitowania. Jeśli nie ma domyślnej akcji, przestanie pytać użytkownika, chyba że podano także --force-confnew lub --force-confold , w którym to przypadku użyje go do podjęcia ostatecznej akcji.

Działa tylko --force-confask, ponieważ wyraźnie zadaje ci pytanie, nawet jeśli wersja jest taka sama. Cytując stronę podręcznika

confask: Jeśli plik konfiguracyjny został zmodyfikowany, zawsze proponuj zastąpienie go wersją w pakiecie, nawet jeśli wersja w pakiecie nie uległa zmianie (od dpkg 1.15.8). Jeśli podano również dowolne z opcji --force-confmiss , --force-confnew , --force-confold lub --force-confdef , zostanie ono użyte do podjęcia ostatecznej akcji.

Mam nadzieję, że to pomoże.

Anwar
źródło
Twoja odpowiedź była bardzo wyczerpująca, dzięki. Czy można również automatycznie odpowiedzieć na pytanie „y”, tzn. Skutecznie --force-confnew? Próbowałem apt-get […] -y, ale to nie zadziałało. (Jeśli nie jest to możliwe, edytuj odpowiedź, aby to powiedzieć.)
Tim Landscheidt,
@TimLandscheidt pytasz, czy można go używać --force-confnewbez pytania? Myślę, że to domyślny przypadek, co oznacza, że ​​zachowa twoje zmiany. --force-confasksprawia, że aptzawsze zadajesz pytanie, w przeciwnym razie użyłbyś innych opcji, jeśli znasz już odpowiedź.
Anwar,
1
Ha, próbowałem -o Dpkg::Options::=--force-confnewbezskutecznie (jak przewidywała twoja odpowiedź) i nie czytałem komunikatu o błędzie, kiedy próbowałem -o Dpkg::Options::="--force-confask --force-confnew". Jednak apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagepoprawnie zastąpił pliki konfiguracyjne zmiany pliku $package. Dzięki!
Tim Landscheidt,
12

Jeśli szkoda została już wyrządzona, oto sposób na odzyskanie oficjalnej wersji pliku konfiguracyjnego z linii poleceń. Najpierw pobierz plik pakietu (albo apt-get --download-onlyjak poniżej, albo ze strony pakietu na packages.ubuntu.com ), a następnie wypakuj jego zawartość w tymczasowej lokalizacji. Następnie możesz skopiować plik do /etc. Upewnij się, że przestrzegasz oryginalnych uprawnień (większość plików /etcjest własnością root i trybu 644 (tj. Do odczytu słów i do zapisu root), ale każdy wyjątek istnieje z ważnego powodu).

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

Pamiętaj, że nie dotyczy to plików konfiguracyjnych, które nie pochodzą z pakietu, takiego jak /etc/fstablub /etc/passwd. Jeśli je zgubisz, jesteś sam. (Większość i tak jest bardzo zależna od systemu.)


W przyszłości polecam korzystanie z etckeeper Zainstaluj etckeeper . Zainstaluj pakiet i uruchom sudo etckeeper init. To ustawia kontrolę wersji dla wszystkich plików w /etc. Nie musisz nic robić, aby zarządzać etckeeper; musisz z nim współdziałać tylko wtedy, gdy chcesz wykonać operację kontroli wersji, na przykład odnosząc się do starszych plików. Pliki są automatycznie zatwierdzane przed i po każdym uruchomieniu apt i każdej nocy (można to skonfigurować).

Domyślnie w Ubuntu etckeeper używa Bazaar . Zmień ustawienie /etc/etckeeper/etckeeper.confprzed uruchomieniem, etckeeper initjeśli wolisz Darcs, Git lub Mercury.

Z Bazaar, aby powrócić /etc/foo.confdo ostatniej zatwierdzonej wersji:

cd /etc
sudo bzr revert foo.conf

Jeśli chcesz cofnąć się w czasie, użyj, sudo bzr log foo.confaby wyświetlić historię pliku, a sudo bzr revert -r 42 foo.confjeśli ustaliłeś, że revno: 42jest to wersja, do której chcesz przywrócić.

Gilles „SO- przestań być zły”
źródło
7

Możesz pobrać pakiet ręcznie ze strony packages.ubuntu.com , rozpakować plik i zastąpić go swoją wersją.

Lub możesz:

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

Drugi jest o wiele bardziej brutalny. Może również wyczyścić inną konfigurację, jeśli używa więcej niż jednego pliku. Pierwszy to więcej kliknięć i wysiłku, ale wydaje się znacznie bezpieczniejszy.

Po drugie, możesz być w stanie po prostu usunąć plik i --reinstall może go zastąpić. Jeśli tak, byłoby to bezpieczniejsze.

Oli
źródło
2
Nie, usunięcie pliku konfiguracyjnego jest uważane za prawidłową modyfikację i jest zachowywane przez apt.
Ryan C. Thompson,
Czy można wyczyścić i ponownie zainstalować pakiet, jeśli zależą od niego inne zainstalowane pakiety?
Ryan C. Thompson,
@RyanThompson Tak, apt-get --reinstall purge packagenie skrzywdzi osób na utrzymaniu.
Oli
Niestety to nie działa.
Anwar
1

W zależności od pakietu możesz znaleźć domyślny plik konfiguracyjny w /usr/share/doc/foo/examples.

misterben
źródło
0

Użyj Synaptic (poprawianie Ubuntu jest jeszcze wygodniejsze, ale synaptic jest prostszy) i wybierz „całkowicie usuń pakiet”. Spowoduje to usunięcie wszystkich plików konfiguracyjnych (możesz wykonać kopię zapasową tych plików!).

Następnie zainstaluj ponownie. Jesteś skończony.

Dzięki Ubuntu Tweak zyskujesz jeszcze więcej opcji czyszczenia, ponownego uruchamiania i tworzenia kopii zapasowych konfiguracji. Może chcesz na to spojrzeć. Jest w centrum oprogramowania.

ps: Synaptic korzysta również z opcji „oczyść” (jak wspomniano powyżej Oli) ... - tylko z GUI dla wygodniejszej obsługi.

piedro
źródło
Jaki pakiet usuwa pliki z katalogu domowego, gdy je usuwasz? Uznałbym to za poważny błąd!
Gilles 'SO - przestań być zły'
@Gilles: Masz rację. Ustawienia osobiste w twoim katalogu domowym nie zostaną dotknięte przez czyszczenie. Zredagowałem i poprawiłem powyższe. sry
piedro
Czyszczenie pakietu może nie być opcją, jeśli inni od niego zależą.
Ryan C. Thompson,
0

W końcu znalazłem odpowiedź, którą niejasno pamiętałem sprzed lat:

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

Argument „confnew” zmusza dpkg do zastąpienia zmodyfikowanych plików konfiguracyjnych plikami dostarczonymi przez pakiet, a „confmiss” robi to samo z usuniętymi plikami konfiguracyjnymi.

Zgodnie z tym czatem możesz także użyć tych opcji poprzez apt-get w następujący sposób:

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

dzięki czemu nie musisz samodzielnie znajdować pliku deb.

Oczywiście te opcje są niebezpieczne i mogą zniszczyć ważne pliki konfiguracji systemu, jeśli zostaną niewłaściwie użyte.

Ryan C. Thompson
źródło
Problem --force-confnewpolega na tym, że instaluje nowe pliki konfiguracyjne tylko w przypadku zmiany wersji. Jeśli instalujesz ponownie tę samą wersję, nie zainstaluje nowego pliku konfiguracyjnego, ponieważ przetestowałem go jawnie
Anwar
I --force-confmisszainstaluje nowy plik konfiguracyjny tylko wtedy, gdy wersja zostanie zmieniona i brakuje konfiguracji. Jak opisano na stronie podręcznika użytkownikaconfmiss: 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