web-dev-qa-db-fra.com

Comment puis-je rétablir un fichier de configuration à la version d'origine après l'avoir modifié?

Je veux rétablir un fichier dans /etc/ dans sa forme d'origine. J'ai édité le fichier depuis son installation. Comment puis-je inverser ce fichier de configuration? Apt est assez intelligent pas pour écraser les fichiers de configuration édités, alors comment puis-je lui dire que je veux le faire?

Par souci d'argumentation, disons que je veux retourner le fichier /etc/foo.conf du paquetage foo.

22
Ryan Thompson

La réponse fournie par Ryan Thomson se dirigeait dans la bonne direction. Néanmoins, il ne serait pas capable de faire le travail (la raison détaillée est donnée ci-dessous).

La manière correcte (et la plus simple) de le faire est d'utiliser _-o_ avec apt pour passer l'option dpkg et de forcer dpkg pour vous demander si vous souhaitez conserver les fichiers de configuration modifiés ou originaux. . La commande sera comme ça -

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

Cela vous poserait une question comme

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

Vous devez appuyer sur Y ou sur I pour installer Le fichier de configuration original du mainteneur de paquet. Vous pouvez même appuyer sur D pour voir quels sont les changements ou démarrer un shell racine avec l'option Z pour vous réparer.

Remarque: Après le remplacement, votre fichier modifié se présente sous la forme _at /etc/foo/foo.conf.dpkg-old_


Pourquoi d'autres options ne fonctionneraient pas?

Parce que les autres options de dpkg ne fonctionnent pas bien. Les options qui traitent des fichiers de configuration d’un paquet sont

  • _--force-confmiss_
  • _--force-confnew_
  • _--force-confold_
  • _--force-confdef_

--force-confmiss ne fonctionnerait pas si la version du paquet ne change pas. De la page de manuel

Si un fichier de configuration a été modifié et que la version du paquet a changé, installez toujours la nouvelle version sans le demander, à moins que - force-confdef ne soit également spécifié, auquel cas l'action par défaut est préférable.

--force-confmiss fonctionne avec les conffiles manquants. Cela échouera aussi lorsque la version ne changera pas. Citant page de manuel

confmiss: Si un fichier de configuration est manquant et que la version du package a changé, installez toujours le fichier de configuration manquant sans le demander. Ceci est dangereux car cela signifie ne pas conserver une modification (suppression) apportée au fichier

--force-confold conservera la version modifiée uniquement si la version est modifiée . Pour le même paquet, il va aussi échouer. Citant page de manuel

confold: Si un fichier de configuration a été modifié et que la version du package a été modifiée, conservez toujours l'ancienne version sans le demander, à moins que - force-confdef est également spécifié, auquel cas l'action par défaut est préférable.

--force-confdef échouera également, car l'action par défaut consiste à conserver le fichier plus ancien (indiqué dans le message affiché avec _--force-confask_. ligne _(Y/I/N/O/D/Z) [default=N]_ qui signifie que conserver est la valeur par défaut (voir ci-dessus). Et si _--force-confnew_ est spécifié mais que la version ne change pas, cela ne fonctionnera pas non plus. Citant page de manuel

confdef: Si un fichier de configuration a été modifié et que la version du package a été modifiée, choisissez toujours l'action par défaut sans invite. S'il n'y a pas d'action par défaut, il cessera de demander à l'utilisateur sauf si - force-confnew ou - force -confold est également indiqué. Dans ce cas, il l'utilisera pour décider de l'action finale.

Seul --force-confask fonctionnera, car il vous posera explicitement la question même lorsque la version est la même. Citant page de manuel

confask: Si un fichier de configuration a été modifié, proposez toujours de le remplacer par la version du package, même si la version du package ne s'est pas modifiée (depuis dpkg 1.15.8). Si n'importe lequel de - force-confmiss , - force-confnew , ( - force-confond , ou - force-confdef est également donné, il sera utilisé pour décider de l'action finale.

J'espère que ça va aider.

13
Anwar

Si le problème est déjà résolu, voici un moyen en ligne de commande pour récupérer la version officielle du fichier de configuration. Commencez par télécharger le fichier de package (soit avec apt-get --download-only comme ci-dessous, soit à partir de la page de package sur packages.ubuntu.com ), puis extrayez son contenu dans un emplacement temporaire. Vous pouvez ensuite copier le fichier dans /etc. Assurez-vous de respecter les autorisations d'origine (la plupart des fichiers de /etc appartiennent à root et au mode 644 (lisible par Word et accessible en écriture par l'utilisateur), mais chaque exception existe pour une raison importante).

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

Notez que cela ne s'applique pas aux fichiers de configuration qui ne proviennent pas d'un package, tels que /etc/fstab ou /etc/passwd. Si vous les perdez, vous êtes seul. (La plupart dépendent de toute façon du système.)


Pour l'avenir, je recommande d'utiliser etckeeper Install etckeeper . Installez le paquet et exécutez Sudo etckeeper init. Ceci configure le contrôle de version pour tous les fichiers dans /etc. Vous n'avez besoin de rien faire pour gérer etckeeper; vous devez uniquement interagir avec ce dernier lorsque vous souhaitez effectuer une opération de contrôle de version, telle que faire référence à des fichiers plus anciens. Les fichiers sont automatiquement validés avant et après chaque exécution d'apt et chaque nuit (cela est configurable).

Par défaut, sur Ubuntu, etckeeper utilise Bazaar . Modifiez le paramètre dans /etc/etckeeper/etckeeper.conf avant d'exécuter etckeeper init si vous préférez Darcs, Git ou Mercury.

Avec Bazaar, rétablir /etc/foo.conf à la dernière version validée:

cd /etc
Sudo bzr revert foo.conf

Si vous voulez remonter dans le temps, utilisez Sudo bzr log foo.conf pour afficher l'historique du fichier et Sudo bzr revert -r 42 foo.conf si vous avez déterminé que revno: 42 est la révision à laquelle vous souhaitez revenir.

12
Gilles

Vous pouvez télécharger le package manuellement à partir de packages.ubuntu.com , extraire le fichier et remplacer votre version par celui-ci.

Ou vous pourriez:

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

La seconde se sent beaucoup plus brutale. Il pourrait aussi effacer les autres configurations s’il utilise plus d’un fichier. Le premier est plus cliqué et effort mais cela semble beaucoup plus sûr.

Pour le second, vous pourrez peut-être simplement supprimer le fichier et --reinstall pourrait le remplacer. Si oui, ce serait plus sûr.

7
Oli

Selon le package, vous pouvez trouver un fichier de configuration par défaut dans /usr/share/doc/foo/examples.

1
misterben

Utilisez Synaptic (Ubuntu Tweak est encore plus pratique mais Synaptic est plus simple) et choisissez "Complètement supprimer le paquet". Cela supprimera tous les fichiers de configuration (vous voudrez peut-être sauvegarder ces fichiers!).

Puis réinstallez. Vous avez terminé.

Avec Ubuntu Tweak, vous avez encore plus d’options pour les sauvegardes de nettoyage, de relecture et de configuration. Peut-être que vous voulez y jeter un coup d'oeil. C'est dans le softwarecenter.

p.s .: Synaptic utilise également l’option "purge" (comme mentionné par Oli ci-dessus ...) - juste avec une interface graphique pour une manipulation plus confortable.

0
piedro

J'ai finalement trouvé la réponse dont je me souvenais vaguement il y a des années:

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

L'argument "confnew" oblige dpkg à remplacer les fichiers de configuration modifiés par ceux fournis par le paquet, et "confmiss" de même avec les fichiers de configuration supprimés.

Selon this chatlog , vous pouvez également utiliser ces options via apt-get de la manière suivante:

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

ce qui vous évite d'avoir à trouver le fichier deb vous-même.

Évidemment, ces options sont dangereuses et risquent d’abandonner des fichiers de configuration système importants en cas d’utilisation abusive.

0
Ryan Thompson