Как я могу вернуть файл конфигурации обратно к исходно установленной версии после того, как я отредактировал его?

Я хочу вернуть файл в /etc/ вернуться к своей изначально установленной форме. Я редактировал файл с момента его установки. Как я могу восстановить этот файл конфигурации? Apt достаточно умен, чтобы не перезаписывать отредактированные файлы конфигурации, так как мне сказать, что я хочу это сделать?

Ради аргумента, скажем, я хочу вернуть файл /etc/foo.conf из пакета foo,

6 ответов

Решение

Ответ, предоставленный Райаном Томсоном, направлялся в правильном направлении. Тем не менее, он не сможет выполнить эту работу (подробное описание приведено ниже).

Правильный (и самый простой) способ сделать это - использовать -o с apt передать опцию dpkg и форсировать dpkg спросить вас, хотите ли вы сохранить измененные файлы конфигурации или исходные. Команда будет такой -

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 не будет работать, если версия пакета не меняется. С man-страницы

Если файл конфигурации был изменен и версия в пакете действительно изменилась, всегда устанавливайте новую версию без запроса, если также не указан параметр --force-confdef, и в этом случае действие по умолчанию является предпочтительным.

--force-confmiss работает с отсутствующими конфилями. Это также потерпит неудачу, когда версия не изменилась. Цитирование man-страницы

confmiss: Если файл conffile отсутствует и версия в пакете действительно изменилась, всегда устанавливайте отсутствующий файл conffile без запроса. Это опасно, поскольку означает не сохранять изменения (удалять), внесенные в файл

--force-confold сохранит измененную версию, только если версия изменена. Для того же пакета это тоже не удастся. Цитирование man-страницы

confold: если conffile был изменен, и версия в пакете действительно изменилась, всегда сохраняйте старую версию без запроса, если также не указан параметр --force-confdef, в этом случае действие по умолчанию является предпочтительным.

--force-confdef также потерпит неудачу, потому что действие по умолчанию - сохранить более старый файл (указывается в сообщении --force-confask, Имеет линию (Y/I/N/O/D/Z) [default=N] что означает сохранение по умолчанию. Смотри выше). И если --force-confnew указана но версия не меняется, что тоже не сработает. Цитирование man-страницы

confdef: если conffile был изменен, а версия в пакете изменилась, всегда выбирайте действие по умолчанию без запроса. Если действия по умолчанию не существует, он перестанет спрашивать пользователя, если только не заданы параметры --force-confnew или --force -confold, и в этом случае он будет использовать это для принятия решения об окончательном действии.

Только --force-confask будет работать, потому что он явно задаст вам вопрос, даже если версия такая же. Цитирование man-страницы

confask: Если conffile был изменен, всегда предлагайте заменить его версией в пакете, даже если версия в пакете не изменилась (начиная с dpkg 1.15.8). Если также указан какой-либо из --force-confmiss, --force-confnew, --force -confold или --force-confdef, он будет использоваться для принятия решения об окончательном действии.

Надеюсь, что это поможет.

Если вред уже нанесен, вот способ вернуть официальную версию файла конфигурации из командной строки. Сначала загрузите файл пакета (либо с apt-get --download-only как показано ниже или со страницы пакета на http://packages.ubuntu.com/), затем извлеките его содержимое во временное расположение. Затем вы можете скопировать файл в /etc, Обязательно соблюдайте исходные разрешения (большинство файлов в /etc принадлежат пользователю root и режиму 644 (т. е. читаемым словом и пишущим root), но каждое исключение существует по важной причине).

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, Если вы потеряете это, вы сами. (Большинство так или иначе очень зависит от системы.)


На будущее рекомендую использовать etckeeper Установить etckeeper, Установите пакет и запустите sudo etckeeper init, Это устанавливает контроль версий для всех файлов в /etc, Вам не нужно ничего делать, чтобы управлять etckeeper; вам нужно взаимодействовать с ним только тогда, когда вы хотите выполнить операцию контроля версий, например, обратиться к старым файлам. Файлы автоматически фиксируются до и после каждого запуска apt и каждую ночь (это настраивается).

По умолчанию в Ubuntu etckeeper использует Bazaar. Изменить настройку в /etc/etckeeper/etckeeper.conf перед запуском etckeeper init если вы предпочитаете Darcs, Git или Mercury.

С базара, чтобы вернуться /etc/foo.conf до последней подтвержденной версии:

cd /etc
sudo bzr revert foo.conf

Если вы хотите вернуться назад во времени, используйте sudo bzr log foo.conf просмотреть историю файла и sudo bzr revert -r 42 foo.conf если вы определили, что revno: 42 это ревизия, к которой вы хотите вернуться.

Вы можете загрузить пакет вручную с http://packages.ubuntu.com/, распаковать файл и заменить его версией.

Или вы могли бы:

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

Второй чувствует себя намного более грубо. Он также может уничтожить другие конфигурации, если он использует более одного файла. Первый - это больше щелчка и усилий, но он кажется намного безопаснее.

Во-вторых, вы можете просто удалить файл, а --reinstall может заменить его. Если так, то это будет безопаснее.

В зависимости от пакета, вы можете найти файл конфигурации по умолчанию в /usr/share/doc/foo/examples,

Используйте Synaptic (твик Ubuntu еще удобнее, но synaptic более понятен) и выберите "полностью удалить пакет". Это удалит все файлы конфигурации (вы можете сделать резервную копию этих файлов!).

Затем переустановите. Вы сделали

С Ubuntu Tweak вы получаете еще больше возможностей для очистки, повторного создания и настройки резервных копий. Может быть, вы хотите взглянуть на это. Это в программном центре.

PS: Synaptic также использует опцию "чистки" (как упоминалось выше Оли...) - просто с графическим интерфейсом для более удобной обработки.

Я наконец нашел ответ, который я смутно вспомнил много лет назад:

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

Аргумент "confnew" вынуждает dpkg заменять измененные файлы конфигурации на предоставленные пакетом, а "confmiss" аналогично действует и с файлами конфигурации, которые были удалены.

Согласно этому чату, вы также можете использовать эти опции через apt-get следующим образом:

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

что избавляет вас от необходимости самостоятельно искать файл deb.

Очевидно, что эти параметры опасны и могут привести к срыву важных файлов конфигурации системы при неправильном использовании.

Другие вопросы по тегам