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

24

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

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

Райан К. Томпсон
источник
2
Для всех тех, кто предлагает чистку и переустановку foo, что, если barзависит, fooа я не хочу удалять bar?
Райан К. Томпсон

Ответы:

15

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

Правильно (и самый простой) способ сделать это использует -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 также дано, оно будет использоваться для определения окончательного действия.

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

Анвар
источник
Ваш ответ был очень исчерпывающим, спасибо. Можно ли также автоматически ответить на вопрос «у», то есть эффективно --force-confnew? Я пытался apt-get […] -y, но это не сработало. (Если это невозможно, пожалуйста, также отредактируйте ответ, чтобы сказать так.)
Тим Ландшайдт
@TimLandscheidt вы спрашиваете, можно ли использовать, --force-confnewне спрашивая? Я думаю, что это случай по умолчанию, что означает, что он сохранит ваши изменения. --force-confaskделает aptвсегда задают вопрос, в противном случае, вы будете использовать другие варианты , если вы уже знаете ответ.
Анвар
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как показано ниже, либо со страницы пакета на 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.

С Bazaar, чтобы вернуться /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

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

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

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

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

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

Оли
источник
2
Нет, удаление файла конфигурации считается допустимой модификацией и сохраняется в apt.
Райан К. Томпсон
Можно ли очистить и переустановить пакет, если от него зависят другие установленные пакеты?
Райан С. Томпсон
@RyanThompson Да, apt-get --reinstall purge packageне обидит иждивенцев.
Оли
К сожалению, это не работает.
Анвар
1

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

misterben
источник
0

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

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

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

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

Piedro
источник
Какой пакет удаляет файлы в вашем домашнем каталоге, когда вы его удаляете? Я бы посчитал это серьезной ошибкой!
Жиль "ТАК - перестань быть злым"
@ Жиль: Ты прав. Чистка личных настроек в вашем домашнем каталоге не будет затронута. Я редактировал и исправлял вышесказанное. sry
piedro
Очистка пакета не может быть вариантом, если другие зависят от него.
Райан С. Томпсон
0

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

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.

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

Райан К. Томпсон
источник
Проблема в --force-confnewтом, что он будет устанавливать новые файлы конфигурации только при изменении версии. Если вы переустанавливаете ту же версию, он не установит новый файл конфигурации, как я это явно протестировал
Anwar
И --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.
Anwar