Bir config dosyasını düzenledikten sonra orijinal olarak kurulu olan sürüme nasıl geri dönebilirim?


24

Bir dosyayı /etc/, asıl yüklü biçimine geri döndürmek istiyorum . Kurulduğundan beri dosyayı değiştirdim. Bu yapılandırma dosyasını nasıl geri alabilirim? Apt akıllı yeter değil hiç üzerine yazma düzenlenmiş ayar dosyaları, bu yüzden nasıl ben o kadar diyeyim istiyorum bunu yapmak için?

Argüman uğruna, dosyayı /etc/foo.confpaketten geri almak istediğimi varsayalım foo.


2
Tasfiye ve yeniden öne sürenleri hepsi için foone olur, barbağlı foove ben kaldırmak istemiyorum bar?
Ryan C. Thompson,

Yanıtlar:


15

Ryan Thomson tarafından verilen cevap doğru yöne gidiyordu. Yine de iş yapamazdı (Detaylar nedeni aşağıda verilmiştir).

Bunu yaparken doğru (ve en kolay) yolu kullanıyor -oile aptdpkg seçeneği geçmek ve zorlamak için dpkgdeğiştirilmiş yapılandırma dosyaları veya orijinal olanları korumak isteyip istemediğinizi sormak. Komut böyle olacak -

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

Bu size bir soru soracaktı

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

Paket sahibinin orijinal yapılandırma dosyasını yüklemek için Y veya I tuşlarına basın . Değişikliklerin ne olduğunu görmek için D tuşuna basabilir veya kendinizle düzeltmek için Z seçeneğiyle bir kök kabuğu başlatabilirsiniz.

Not: Değiştirme işleminden sonra, değiştirilmiş dosyanızı olarak bulabilirsiniz.at /etc/foo/foo.conf.dpkg-old


Diğer seçenekler neden işe yaramaz?

Çünkü dpkg'daki diğer seçenekler iyi çalışmıyor. Bir paketin config dosyaları ile ilgilenen seçenekler

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

--force-confmissPaket sürümü değişmediğinde işe yaramaz. Adam sayfasından

Bir conffile değiştirilmişse ve paketteki sürüm değişmişse , --force-confdef de belirtilmediği sürece yeni sürümü her zaman sormadan yükleyin, bu durumda varsayılan eylem tercih edilir.

--force-confmisseksik karışımlarla çalışır. Sürüm değişmediğinde de başarısız olur. Adam sayfasından alıntı

confmiss: Bir conffile eksikse ve paketteki sürüm değişmişse, sormadan her zaman eksik conffile'i kurun. Bu tehlikelidir, çünkü dosyada yapılan bir değişikliği (kaldırmadan) korumak anlamına gelmez

--force-confoldyalnızca değiştirilmiş versiyonu koruyacaktır sürümü değiştirilir . Aynı paket için de başarısız olur. Adam sayfasından alıntı

confold: Bir conffile değiştirilmişse ve paketteki sürüm değiştiyse , --force-confdef de belirtilmediği sürece eski sürümü her zaman sormadan saklayın , bu durumda varsayılan eylem tercih edilir.

--force-confdefVarsayılan işlem daha eski dosyayı saklamak olduğu için de başarısız olacaktır (ile gösterilen mesajdan belirtilmiştir --force-confask. Bu, (Y/I/N/O/D/Z) [default=N]saklamanın varsayılan olduğu anlamına gelir. Ve --force-confnewbelirtilirse ancak sürüm değişmezse, bu da işe yaramaz. Adam sayfasından alıntı

confdef: Bir conffile değiştirilmişse ve paketteki sürüm değişmişse, sormadan her zaman varsayılan eylemi seçin. Varsayılan bir eylem yoksa, kullanıcıya --force-confnew veya --force-confold belirtilmediği sürece sormaktan vazgeçer , bu durumda son eyleme karar vermek için bunu kullanır.

Yalnızca --force-confaskçalışacak, çünkü sürüm aynı olsa bile size açıkça soru soracaktır. Adam sayfasından alıntı

confask: Eğer bir conffile değiştirilmişse, paketteki sürüm değişmemiş olsa bile (paketteki sürüm (dpkg 1.15.8'den beri) ile değiştiriniz. Herhangi Eğer --force-confmiss , --force-confnew , --force-confold veya --force-confdef da verilir, nihai eylem karar vermek kullanılacaktır.

Umarım yardımcı olur.


Cevabınız çok kapsamlıydı, teşekkürler. Etkili bir şekilde soruyu otomatik olarak "y" ile cevaplamak da mümkün mü --force-confnew? Denedim apt-get […] -yama bu işe yaramadı. (Eğer mümkün değilse, lütfen bunu söylemek için cevabı da
Tim Landscheidt

@TimLandscheidt sormadan kullanmanın mümkün olup --force-confnewolmadığını mı soruyorsunuz? Bunun varsayılan durum olduğunu düşünüyorum, bu da değişikliklerinizi koruyacağı anlamına gelir. --force-confaskyapar apthep zaten cevabı biliyorum, aksi takdirde, diğer seçenekleri kullanmayı tercih ediyorum, soru sormak.
Anwar

1
Ha, -o Dpkg::Options::=--force-confnewbaşarısız denedim (cevabın tahmin ettiği gibi) ve denediğimde hata mesajını okumadım -o Dpkg::Options::="--force-confask --force-confnew". Ancak, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagedeğişiklik yapılandırma dosyalarının üzerine doğru bir şekilde yazdı $package. Teşekkürler!
Tim Landscheidt

12

Zararı zaten yapılmışsa, yapılandırma dosyasının resmi sürümünü geri almanın komut satırı budur. Öncelikle, paket dosyasını indirin ( apt-get --download-onlyaşağıdaki şekilde veya paketler.ubuntu.com adresindeki paket sayfasından ), ardından içeriğini geçici bir yere çıkartın. Daha sonra dosyayı içine kopyalayabilirsiniz /etc. Orijinal izinlere uyduğunuzdan emin olun (çoğu dosya /etckök ve kip 644'e aittir (örneğin, sözcükle okunabilir ve kök ile yazılabilir), ancak istisnaların her biri için önemli bir neden vardır).

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

Bunun, /etc/fstabveya gibi bir paketten olmayan yapılandırma dosyaları için geçerli olmadığını unutmayın /etc/passwd. Bunları kaybedersen, kendi başınasın. (Zaten çoğu sisteme çok bağımlıdır.)


Gelecek için, etckeeper kullanmanızı öneririmEtckeeper'ı yükle . Paketi kurun ve çalıştırın sudo etckeeper init. Bu, içindeki tüm dosyalar için sürüm kontrolünü ayarlar /etc. Etkuyruğu yönetmek için başka bir şey yapmanıza gerek yoktur; yalnızca eski dosyalara gönderme gibi bir sürüm kontrolü işlemi yapmak istediğinizde bununla etkileşime geçmeniz gerekir. Dosyalar her apt çalıştırma işleminden önce ve sonra ve her gece otomatik olarak hazırlanır (bu yapılandırılabilir).

Varsayılan olarak, Ubuntu, etckeeper kullanır Çarşısı . Darcs, Git veya Mercury'yi tercih ediyorsanız, /etc/etckeeper/etckeeper.confçalıştırmadan önce ayarı değiştirin etckeeper init.

Bazaar /etc/foo.confile en son taahhüt edilen sürüme geri dönmek için:

cd /etc
sudo bzr revert foo.conf

Zamanda daha ileri gitmek istiyorsanız sudo bzr log foo.conf, dosyanın geçmişini görüntülemek için kullanın ve sudo bzr revert -r 42 foo.confbunun revno: 42geri dönmek istediğiniz revizyon olduğunu belirlediyseniz .


7

Paketi el ile paketleri.ubuntu.com adresinden indirebilir, dosyayı çıkarabilir ve sürümünüzü onunla değiştirebilirsiniz.

Veya şunları yapabilirsiniz:

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

İkincisi çok daha acımasız hissediyor. Birden fazla dosya kullanıyorsa, diğer yapılandırmaları da silebilir. Birincisi, daha fazla tıklama ve çaba göstermek ancak çok daha güvenli görünüyor.

İkincisi, dosyayı silebilirsiniz ve --reinstall dosyayı değiştirebilir. Eğer öyleyse, bu daha güvenli olurdu.


2
Hayır, bir yapılandırma dosyasını silmek geçerli bir değişiklik olarak kabul edilir ve apt ile korunur.
Ryan C. Thompson

Takılan diğer paketler buna bağlıysa bir paketi temizlemek ve yeniden yüklemek mümkün müdür?
Ryan C. Thompson

@RyanThompson Evet, apt-get --reinstall purge packagebağımlılarına zarar vermez.
Oli

Maalesef işe yaramıyor.
Anwar,

1

Pakete bağlı olarak, içinde varsayılan bir config dosyası bulabilirsiniz /usr/share/doc/foo/examples.


0

Synaptic kullanın (Ubuntu tweak daha da uygundur ancak synaptic daha yalındır) ve "tamamen paketi kaldır" ı seçin. Bu, tüm yapılandırma dosyalarını siler (bu dosyaları yedeklemek isteyebilirsiniz!).

Ardından tekrar yükleyin. Sen bittin.

Ubuntu Tweak ile temizleme, yeniden kayıt ve yapılandırma yedekleri için daha da fazla seçenek elde edersiniz. Belki bir göz atmak istersiniz. Yazılım merkezinde.

ps: Synaptic, ayrıca "daha rahat kullanım için bir GUI ile" (yukarıda Oli'nin bahsettiği gibi ...) "temizleme" seçeneğini de kullanır.


Hangi paketi kaldırdığınızda ana dizininizdeki dosyaları kaldırır? Bunun ciddi bir böcek olduğunu düşünürdüm!
Gilles 'SO- kötü olmayı bırak' 19:10 'da

@Gilles: Haklısın. Ana dizininizdeki kişisel ayarlara temizleme işleminden dokunulmaz. Yukarıdakileri düzenledim ve düzelttim. sry
piedro

Paketin temizlenmesi, eğer başkaları buna bağlıysa bir seçenek olmayabilir.
Ryan C. Thompson

0

Sonunda, yıllar önce belirsiz bir şekilde hatırladığım cevabı buldum:

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

"Confnew" argümanı dpkg'yi değiştirilmiş yapılandırma dosyalarını paketlenmiş olanlarla değiştirmeye zorlar ve "confmiss" aynı şekilde silinmiş olan config dosyaları ile de yapar.

Bu chatloga göre , bu seçenekleri apt-get yoluyla aşağıdaki şekilde de kullanabilirsiniz:

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

Hangi deb dosyasını kendiniz bulmanız gerektiğinden kurtarır.

Açıkçası, bu seçenekler tehlikelidir ve kötüye kullanılması durumunda önemli sistem yapılandırma dosyalarını silme potansiyeli vardır.


Sorun --force-confnew, sürüm değişirse yalnızca yeni yapılandırma dosyalarını yükleyebilmesidir. Aynı sürümü yeniden yüklüyorsanız, açıkça test ettiğim gibi yeni config dosyası yüklemeyecek
Anwar

Ve --force-confmisssadece sürüm değiştirilmiş ve config eksikse yeni config dosyasını yükleyecektir. Man sayfasında tarif edildiği gibiconfmiss: 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.