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

24

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

Par souci d'argument, disons que je veux restaurer le fichier /etc/foo.confdu package foo.

Ryan C. Thompson
la source
2
Pour tous ceux qui suggèrent de purger et de réinstaller foo, que faire si cela bardépend fooet que je ne veux pas supprimer bar?
Ryan C. Thompson

Réponses:

15

La réponse fournie par Ryan Thomson allait dans le bon sens. Il ne serait toujours pas en mesure de faire le travail (la raison détaillée est donnée ci-dessous).

La façon correcte (et la plus simple) de le faire consiste à utiliser l' option -oavec aptpour passer dpkg et dpkgà vous forcer à vous demander si vous souhaitez conserver les fichiers de configuration modifiés ou les fichiers d'origine. 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 I pour installer le fichier de configuration d'origine du responsable du package. Vous pouvez même appuyer sur D pour voir quelles sont les modifications ou démarrer un shell racine avec l'option Z pour vous réparer.

Remarque: Après le remplacement, vous trouverez votre fichier modifié commeat /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 package sont

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

--force-confmissne fonctionnerait pas lorsque la version du package ne change pas. Depuis la page de manuel

Si un conffile a été modifié et que la version du package a changé, installez toujours la nouvelle version sans invite, sauf si --force-confdef est également spécifié, auquel cas l'action par défaut est préférée.

--force-confmissfonctionne avec des conffiles manquants. Il échouera également lorsque la version n'a pas changé. Citation de la page de manuel

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

--force-confoldconservera la version modifiée uniquement si la version est modifiée . Pour le même package, il échouera également. Citation de la page de manuel

confold: si un conffile a été modifié et que la version du package a changé, conservez toujours l'ancienne version sans invite, sauf si --force-confdef est également spécifié, auquel cas l'action par défaut est préférée.

--force-confdeféchouera également car l'action par défaut consiste à conserver l'ancien fichier (indiqué dans le message illustré par --force-confask. Il a une ligne (Y/I/N/O/D/Z) [default=N]qui signifie que la conservation est par défaut. Voir ci-dessus). Et si --force-confnewest spécifié mais que la version ne change pas, cela ne fonctionnera pas non plus. Citation de la page de manuel

confdef: Si un conffile a été modifié et que la version dans le package a changé, choisissez toujours l'action par défaut sans invite. S'il n'y a pas d'action par défaut, il s'arrêtera pour demander à l'utilisateur à moins que --force-confnew ou --force-confold ne soit également donné, auquel cas il l'utilisera pour décider de l'action finale.

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

confask: Si un conffile a été modifié, proposez toujours de le remplacer par la version du package, même si la version du package n'a pas changé (depuis dpkg 1.15.8). Si l'un des paramètres --force-confmiss , --force-confnew , --force-confold ou --force-confdef est également indiqué, il sera utilisé pour décider de l'action finale.

J'espère que cela vous aidera.

Anwar
la source
Votre réponse était très complète, merci. Est-il également possible de répondre automatiquement à la question par "y", c'est-à-dire efficacement --force-confnew? J'ai essayé apt-get […] -y, mais cela n'a pas fonctionné. (Si ce n'est pas possible, veuillez également modifier la réponse pour le dire.)
Tim Landscheidt
@TimLandscheidt vous demandez s'il est possible d'utiliser --force-confnewsans demander? Je pense que c'est le cas par défaut, ce qui signifie qu'il conservera vos modifications. --force-confaskfait apttoujours poser la question, sinon, vous utiliseriez d'autres options si vous connaissez déjà la réponse.
Anwar
1
Ha, j'avais essayé -o Dpkg::Options::=--force-confnewsans succès (comme votre réponse l'avait prédit) et je n'ai pas lu le message d'erreur quand j'ai essayé -o Dpkg::Options::="--force-confask --force-confnew". Cependant, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagecorrectement remplacé les fichiers de configuration de modification de $package. Merci!
Tim Landscheidt
12

Si le mal est déjà fait, voici un moyen en ligne de commande de récupérer la version officielle du fichier de configuration. Tout d'abord, téléchargez le fichier de package (avec apt-get --download-onlycomme ci-dessous, ou à 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 dans /etcappartiennent à root et au mode 644 (c'est-à-dire lisibles en mots et en écriture en racine), mais chaque exception est là 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/fstabou /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 Installer etckeeper . Installez le package et exécutez sudo etckeeper init. Cela configure le contrôle de version pour tous les fichiers dans /etc. Vous n'avez rien d'autre à faire pour gérer etckeeper; vous devez uniquement interagir avec lui lorsque vous souhaitez effectuer une opération de contrôle de version, par exemple en vous référant à des fichiers plus anciens. Les fichiers sont automatiquement validés avant et après chaque exécution d'apt et chaque nuit (ceci est configurable).

Par défaut, sur Ubuntu, etckeeper utilise Bazaar . Modifiez le paramètre /etc/etckeeper/etckeeper.confavant de lancer etckeeper initsi vous préférez Darcs, Git ou Mercury.

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

cd /etc
sudo bzr revert foo.conf

Si vous souhaitez remonter plus loin dans le temps, utilisez sudo bzr log foo.confpour afficher l'historique du fichier et sudo bzr revert -r 42 foo.confsi vous avez déterminé qu'il revno: 42s'agit de la révision à laquelle vous souhaitez revenir.

Gilles 'SO- arrête d'être méchant'
la source
7

Vous pouvez télécharger le package manuellement depuis 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

Le second semble beaucoup plus brutal. Il peut également effacer d'autres configurations s'il utilise plusieurs fichiers. Le premier est plus de clics et d'efforts, mais il semble beaucoup plus sûr.

Pour la seconde, vous pourrez peut-être simplement supprimer le fichier et --reinstall pourrait le remplacer. Si c'est le cas, ce serait plus sûr.

Oli
la source
2
Non, la suppression d'un fichier de configuration est considérée comme une modification valide et est conservée par apt.
Ryan C. Thompson,
Est-il possible de purger et de réinstaller un package si d'autres packages installés en dépendent?
Ryan C. Thompson
@RyanThompson Oui, apt-get --reinstall purge packagecela ne fera pas de mal aux personnes à charge.
Oli
Malheureusement ça ne marche pas.
Anwar
1

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

misterben
la source
0

Utilisez Synaptic (Ubuntu tweak est encore plus pratique mais synaptic est plus simple) et choisissez «supprimer complètement le package». Cela supprimera tous les fichiers de configuration (vous voudrez peut-être sauvegarder ces fichiers!).

Réinstallez ensuite. Vous avez terminé.

Avec Ubuntu Tweak, vous obtenez encore plus d'options pour le nettoyage, le relancement et les sauvegardes de configuration. Vous voulez peut-être y jeter un œil. C'est dans le softwarecenter.

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

piedro
la source
Quel package supprime les fichiers de votre répertoire personnel lorsque vous le supprimez? Je considérerais cela comme un grave bug!
Gilles 'SO- arrête d'être méchant'
@ Gilles: Tu as raison. Les paramètres personnels de votre répertoire personnel ne seront pas touchés par la purge. J'ai édité et corrigé ce qui précède. sry
piedro
La purge du package peut ne pas être une option si d'autres en dépendent.
Ryan C. Thompson
0

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" force dpkg à remplacer les fichiers de configuration modifiés par ceux fournis par le paquet, et "confmiss" fait de même avec les fichiers de configuration qui ont été supprimés.

Selon ce journal de discussion , 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.

De toute évidence, ces options sont dangereuses et ont le potentiel de détruire des fichiers de configuration système importants en cas de mauvaise utilisation.

Ryan C. Thompson
la source
Le problème --force-confnewest qu'il n'installera de nouveaux fichiers de configuration que si la version est modifiée. Si vous réinstallez la même version, il n'installera pas de nouveau fichier de configuration car je l'ai testé explicitement
Anwar
Et --force-confmissn'installera un nouveau fichier de configuration que si la version est modifiée et que la configuration est manquante. Comme décrit dans la page de manuelconfmiss: 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