अपने द्वारा संपादित किए जाने के बाद मैं मूल रूप से इंस्टॉल किए गए संस्करण में एक कॉन्फ़िगर फ़ाइल को वापस कैसे ला सकता हूं?


24

मैं किसी फ़ाइल /etc/को उसके मूल रूप से संस्थापित रूप में वापस करना चाहता हूँ । मैंने फ़ाइल को तब से संपादित किया है जब यह स्थापित किया गया था। मैं इस कॉन्फ़िग फ़ाइल को कैसे वापस ला सकता हूं? Apt काफी स्मार्ट है जो एडिट की हुई फाइल्स को ओवरराइट नहीं करता है, इसलिए मैं इसे कैसे बताऊं कि मैं ऐसा करना चाहता हूं ?

तर्क के लिए, मान लें कि मैं /etc/foo.confपैकेज से फ़ाइल वापस लेना चाहता हूं foo


2
उन सभी के लिए जो शुद्धिकरण और पुनर्स्थापना का सुझाव देते हैं foo, अगर क्या barनिर्भर करता है fooऔर मैं नहीं निकालना चाहता हूं bar?
रयान सी। थॉम्पसन

जवाबों:


15

रयान थॉमसन द्वारा प्रदान किया गया जवाब सही तरीके से जा रहा था। फिर भी यह काम करने में सक्षम नहीं होगा (विवरण कारण नीचे दिया गया है)।

ऐसा करने का सही (और आसान) जिस तरह से उपयोग कर रहा है -oके साथ aptdpkg विकल्प गुजरती हैं और मजबूर करने के लिए dpkgआप से पूछना करने के लिए आप संशोधित config फाइल या मूल लोगों को बनाए रखने के लिए करना चाहते हैं। कमान इस तरह होगी -

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

यह आपसे एक प्रश्न पूछेगा

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

आपको पैकेज अनुरक्षक की मूल कॉन्फ़िग फ़ाइल को स्थापित करने के लिए Y या I को दबाना होगा । आप यह देखने के लिए भी D दबा सकते हैं कि अपने आप को ठीक करने के लिए Z विकल्प के साथ कौन से परिवर्तन या एक रूट शेल शुरू करें।

नोट: प्रतिस्थापन के बाद, आपको अपनी संशोधित फ़ाइल मिल जाएगीat /etc/foo/foo.conf.dpkg-old


अन्य विकल्प काम क्यों नहीं करेंगे?

क्योंकि dpkg में अन्य विकल्प अच्छी तरह से काम नहीं करते हैं। विकल्प जो पैकेज की कॉन्फिग फाइलों से संबंधित हैं

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

--force-confmissजब पैकेज संस्करण नहीं बदलेगा तो काम नहीं करेगा। मैन-पेज से

यदि एक शंकुधारी को संशोधित किया गया है और पैकेज में संस्करण बदल गया है, तो हमेशा नए संस्करण को बिना संकेत दिए स्थापित करें, जब तक --force-confdef भी निर्दिष्ट नहीं किया जाता है, उस स्थिति में डिफ़ॉल्ट कार्रवाई पसंद की जाती है।

--force-confmissगायब शंकुधारी के साथ काम करता है। यह भी विफल हो जाएगा जब संस्करण नहीं बदला। मानव-पृष्ठ का उद्धरण

कन्फ़मिस: अगर कोई शंकुधारी गायब है और पैकेज में संस्करण बदल गया है, तो हमेशा बिना रुके लापता कॉनफिल स्थापित करें। यह खतरनाक है, क्योंकि इसका मतलब फ़ाइल में किए गए बदलाव (हटाने) को संरक्षित नहीं करना है

--force-confoldयदि परिवर्तित किया गया है तो केवल संशोधित संस्करण को बनाए रखेगा । एक ही पैकेज के लिए, यह भी विफल हो जाएगा। मानव-पृष्ठ का उद्धरण

कबूल करें: यदि एक शंकुधारी को संशोधित किया गया है और पैकेज में संस्करण बदल गया है, तो हमेशा पुराने संस्करण को बिना संकेत दिए रखें, जब तक कि --force-confdef भी निर्दिष्ट नहीं किया जाता है, उस स्थिति में डिफ़ॉल्ट कार्रवाई को प्राथमिकता दी जाती है।

--force-confdefयह भी विफल हो जाएगा क्योंकि डिफ़ॉल्ट क्रिया पुरानी फ़ाइल को बनाए रखने के लिए है ( --force-confaskइसके साथ दिखाए गए संदेश से संकेतित है । इसकी लाइन है (Y/I/N/O/D/Z) [default=N]जिसका अर्थ है कि डिफ़ॉल्ट डिफ़ॉल्ट है। ऊपर देखें)। और अगर --force-confnewनिर्दिष्ट किया गया है लेकिन संस्करण नहीं बदलता है, तो वह भी काम नहीं करेगा। मानव-पृष्ठ का उद्धरण

confdef: यदि एक शंकुधारी को संशोधित किया गया है और पैकेज में संस्करण बदल गया है, तो हमेशा बिना देर किए डिफ़ॉल्ट कार्रवाई चुनें। यदि कोई डिफ़ॉल्ट कार्रवाई नहीं है, तो यह उपयोगकर्ता से पूछना बंद कर देगा जब तक कि --force-confnew या --force-confold भी नहीं दिया गया है, इस स्थिति में यह अंतिम कार्रवाई को तय करने के लिए उपयोग करेगा।

केवल --force-confaskकाम करेगा, क्योंकि यह संस्करण समान होने पर भी आपसे स्पष्ट रूप से सवाल पूछेगा। मानव-पृष्ठ का उद्धरण

confask: अगर किसी कॉनफाइल को संशोधित किया गया है, तो इसे हमेशा पैकेज में संस्करण के साथ बदलने की पेशकश करें, भले ही पैकेज में संस्करण नहीं बदला (dpkg 1.15.8 के बाद से)। यदि कोई --force-confmiss , --force-confnew , --force-confold , या --force-confdef भी दिया जाता है, तो इसका उपयोग अंतिम कार्रवाई तय करने के लिए किया जाएगा।

आशा है कि मदद मिलेगी।


आपका उत्तर बहुत व्यापक था, धन्यवाद। क्या "y" अर्थात प्रभावी रूप से प्रश्न का स्वतः उत्तर देना भी संभव है --force-confnew? मैंने कोशिश की apt-get […] -y, लेकिन वह काम नहीं किया। (यदि यह संभव नहीं है, तो कृपया ऐसा कहने के लिए उत्तर भी संपादित करें।)
टिम लैंडस्केपिड

@TimLandscheidt आप पूछ रहे हैं कि क्या --force-confnewबिना पूछे उपयोग करना संभव है ? मुझे लगता है कि यह डिफ़ॉल्ट मामला है, जिसका अर्थ है कि यह आपके परिवर्तनों को बनाए रखेगा। --force-confaskबनाता aptहमेशा सवाल पूछते हैं, अन्यथा, आप अन्य विकल्पों का उपयोग करते हैं आप पहले से ही उत्तर जानते हैं।
अनवर 12

1
हा, मैंने -o Dpkg::Options::=--force-confnewअसफलता की कोशिश की थी (जैसा कि आपके उत्तर की भविष्यवाणी की गई थी) और जब मैंने कोशिश की तो त्रुटि संदेश नहीं पढ़ा -o Dpkg::Options::="--force-confask --force-confnew"। हालाँकि, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packageपरिवर्तन कॉन्फ़िगरेशन फ़ाइलों को सही ढंग से ओवरवोट करता है $package। धन्यवाद!
टिम लैंडस्केपड

12

यदि नुकसान पहले से ही है, तो कॉन्फ़िगरेशन फ़ाइल के आधिकारिक संस्करण को वापस लेने का एक कमांड लाइन तरीका है। सबसे पहले, पैकेज फ़ाइल डाउनलोड करें (या तो apt-get --download-onlyनीचे के साथ , या संकुल पृष्ठ पर से संकुल .ubuntu.com पर ), फिर एक अस्थायी स्थान पर इसकी सामग्री निकालें। फिर आप फ़ाइल को कॉपी कर सकते हैं /etc। मूल अनुमतियों का सम्मान करना सुनिश्चित करें (अधिकांश फाइलें /etcरूट और मोड 644 (यानी शब्द-पठनीय और मूल-लेखन योग्य) के स्वामित्व में हैं, लेकिन एक महत्वपूर्ण कारण के लिए प्रत्येक अपवाद है)।

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

ध्यान दें कि यह कॉन्फ़िगरेशन फ़ाइलों पर लागू नहीं होता है जो पैकेज से नहीं हैं, जैसे कि /etc/fstabया /etc/passwd। यदि आप इन्हें खो देते हैं, तो आप अपने दम पर हैं। (अधिकांश वैसे भी बहुत प्रणाली पर निर्भर हैं।)


भविष्य के लिए, मैं एटकीपर का उपयोग करने की सलाह देता हूं एटकीपर स्थापित करें। पैकेज स्थापित करें और चलाएं sudo etckeeper init। यह सभी फ़ाइलों के लिए संस्करण नियंत्रण सेट करता है /etc। आपको एटकीपर को प्रबंधित करने के लिए कुछ और करने की आवश्यकता नहीं है; आपको केवल इसके साथ इंटरेक्ट करने की आवश्यकता होती है जब आप एक संस्करण नियंत्रण ऑपरेशन करना चाहते हैं, जैसे कि पुरानी फ़ाइलों का जिक्र। फ़ाइलें प्रत्येक रात्रि और प्रत्येक रात्रि के चलने से पहले और बाद में स्वचालित रूप से प्रतिबद्ध होती हैं (यह विन्यास योग्य है)।

डिफ़ॉल्ट रूप से, उबंटू पर, एटकीपर बाज़ार का उपयोग करता है । यदि आप डार्क्स, गिट या मर्करी पसंद करते हैं तो /etc/etckeeper/etckeeper.confचलाने से पहले सेटिंग बदलें etckeeper init

बाज़ार के साथ, /etc/foo.confअंतिम प्रतिबद्ध संस्करण में वापस आने के लिए:

cd /etc
sudo bzr revert foo.conf

यदि आप समय में और पीछे जाना चाहते हैं, sudo bzr log foo.confतो फ़ाइल के इतिहास को देखने के लिए उपयोग करें, और sudo bzr revert -r 42 foo.confयदि आपने निर्धारित किया है कि revno: 42संशोधन है जिसे आप वापस करना चाहते हैं।


7

आप संकुल को मैन्युअल रूप से package.ubuntu.com से डाउनलोड कर सकते हैं , फ़ाइल निकाल सकते हैं और इसके साथ अपने संस्करण को बदल सकते हैं।

या आप कर सकते हैं:

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

दूसरा बहुत अधिक क्रूर लगता है। यदि यह एक से अधिक फ़ाइल का उपयोग करता है, तो यह अन्य कॉन्फ़िगरेशन को भी मिटा सकता है। पहला क्लिक और प्रयास अधिक है, लेकिन यह अधिक सुरक्षित लगता है।

दूसरे के लिए, आप बस फ़ाइल को हटाने में सक्षम हो सकते हैं और --reinstall इसे बदल सकते हैं। यदि हां, तो यह सुरक्षित होगा।


2
नहीं, कॉन्फ़िगरेशन फ़ाइल को हटाना एक मान्य संशोधन माना जाता है, और इसे उपयुक्त रूप से संरक्षित किया जाता है।
रयान सी। थॉम्पसन

क्या पैकेज को शुद्ध करना और पुन: स्थापित करना संभव है यदि अन्य स्थापित पैकेज इस पर निर्भर हैं?
रायन सी। थॉम्पसन

@RyanThompson हाँ, apt-get --reinstall purge packageआश्रितों को चोट नहीं पहुंचेगी।
ओली

दुर्भाग्य से यह काम नहीं करता है।
अनवर

1

पैकेज के आधार पर, आपको एक डिफ़ॉल्ट कॉन्फिग फ़ाइल मिल सकती है /usr/share/doc/foo/examples


0

सिनैप्टिक का उपयोग करें (उबंटू ट्विक और भी सुविधाजनक है लेकिन सिंटैप्टिक अधिक सीधे आगे है) और "पूरी तरह से हटाए गए पैकेज" चुनें। यह सभी कॉन्फिग फाइल को डिलीट कर देगा (आप चाहें तो इन फाइल्स का बैकअप ले सकते हैं!)।

फिर पुनर्स्थापित करें। हो गया।

उबंटू ट्वीक के साथ आपको क्लीनअप, रेरोलिंग और कॉन्फ़िगरेशन बैकअप के लिए और भी अधिक विकल्प मिलते हैं। शायद आप इसे एक रूप देना चाहते हैं। यह सॉफ्टवेयरसेंटर में है।

ps: Synaptic भी "purge" विकल्प का उपयोग करता है (जैसे ऊपर उल्लू द्वारा उल्लिखित ...) - अधिक आरामदायक हैंडलिंग के लिए बस GUI के साथ।


जब आप इसे हटाते हैं तो कौन सी पैकेज आपके घर की निर्देशिका में फ़ाइलों को हटा देती है? मैं इसे एक गंभीर बग मानूंगा!
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: आप सही कह रहे हैं। आपके घर निर्देशिका के भीतर व्यक्तिगत सेटिंग्स पर्स द्वारा छुआ नहीं जाएगा। मैंने उपरोक्त को संपादित और ठीक किया। sry
piedro

यदि अन्य व्यक्ति इस पर निर्भर करते हैं, तो पैकेज को शुद्ध करना एक विकल्प नहीं हो सकता है।
रायन सी। थॉम्पसन

0

अंत में मुझे वह उत्तर मिला जो मुझे बरसों पहले याद आया था:

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

"Confnew" तर्क dpkg को पैकेज-प्रदत्त लोगों के साथ संशोधित कॉन्फिग फाइलों को बदलने के लिए मजबूर करता है, और "कन्फ़र्म" उसी तरह से कॉन्फ़िगर की गई फ़ाइलों के साथ होता है जिन्हें हटा दिया गया है।

इस चैटलॉग के अनुसार , आप निम्न तरीकों से apt-get के माध्यम से इन विकल्पों का उपयोग कर सकते हैं:

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

जो आपको डिबेट फ़ाइल को खोजने की आवश्यकता से बचाता है।

जाहिर है, ये विकल्प खतरनाक हैं और दुरुपयोग होने पर महत्वपूर्ण सिस्टम कॉन्फ़िगरेशन फ़ाइलों को उड़ाने की क्षमता रखते हैं।


इसके साथ समस्या --force-confnewयह है कि संस्करण में परिवर्तन होने पर ही नई कॉन्फिग फाइलों को संस्थापित किया जाएगा। यदि आप एक ही संस्करण को पुन: स्थापित कर रहे हैं, तो यह नई कॉन्फिग फ़ाइल को स्थापित नहीं करेगा जैसा कि मैंने इसे स्पष्ट रूप से परीक्षण किया है
अनवर

और --force-confmissकेवल नई कॉन्फ़िगरेशन फ़ाइल स्थापित करेगा यदि संस्करण बदल दिया गया है और कॉन्फ़िगरेशन गायब है। जैसा कि मैन पेज में वर्णित हैconfmiss: 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.
अनवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.