¿Cómo puedo revertir un archivo de configuración a la versión instalada originalmente después de haberlo editado?

24

Quiero revertir un archivo /etc/a su forma original instalada. He editado el archivo desde que se instaló. ¿Cómo puedo revertir este archivo de configuración? Apt es lo suficientemente inteligente como para no sobrescribir los archivos de configuración editados, entonces, ¿cómo le digo que quiero que lo haga?

Por el bien de la discusión, digamos que quiero revertir el archivo /etc/foo.confdel paquete foo.

Ryan C. Thompson
fuente
2
Para todos aquellos que sugieren purgar y volver a instalar foo, lo que si bardepende de fooy no me quiero quitar bar?
Ryan C. Thompson el

Respuestas:

15

La respuesta proporcionada por Ryan Thomson se dirigía al camino correcto. Aún así no podría hacer el trabajo (la razón de los detalles se proporciona a continuación).

La forma correcta (y más fácil) de hacerlo está utilizando -ocon el aptpasar opción dpkg y forzar a dpkgpreguntarle si desea conservar los archivos de configuración modificados o los originales. El comando será así:

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

Esto te haría una pregunta como

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

Debe presionar Y o I para instalar el archivo de configuración original del mantenedor del paquete. Incluso puede presionar D para ver cuáles son los cambios o iniciar un shell raíz con la opción Z para solucionarlo.

Nota: Después del reemplazo, encontrará su archivo modificado comoat /etc/foo/foo.conf.dpkg-old


¿Por qué otras opciones no funcionarían?

Porque las otras opciones en dpkg no funcionan bien. Las opciones que se ocupan de los archivos de configuración de un paquete son

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

--force-confmissno funcionaría cuando la versión del paquete no cambie. De la página man

Si se modificó un archivo de conffg y la versión del paquete cambió, siempre instale la nueva versión sin preguntar , a menos que también se especifique --force-confdef , en cuyo caso se prefiere la acción predeterminada.

--force-confmissfunciona con archivos faltantes. También fallará cuando la versión no haya cambiado. Citando la página man

confmiss: si falta un archivo de configuración y la versión del paquete cambió, siempre instale el archivo de configuración que falta sin preguntar. Esto es peligroso, ya que significa no preservar un cambio (eliminación) realizado en el archivo

--force-confoldretendrá la versión modificada solo si se cambia la versión . Para el mismo paquete, también fallará. Citando la página man

confold: si se modificó un archivo de conffg y la versión del paquete cambió, mantenga siempre la versión anterior sin preguntar , a menos que también se especifique --force-confdef , en cuyo caso se prefiere la acción predeterminada.

--force-confdeftambién fallará porque la acción predeterminada es retener el archivo anterior (indicado por el mensaje que se muestra con --force-confask. Tiene una línea (Y/I/N/O/D/Z) [default=N]que significa que la retención es predeterminada. Ver arriba). Y si --force-confnewse especifica pero la versión no cambia, eso tampoco funcionará. Citando la página man

confdef: si se modificó un archivo de conffg y la versión del paquete cambió, elija siempre la acción predeterminada sin preguntar. Si no hay una acción predeterminada, dejará de preguntarle al usuario a menos que también se indique --force-confnew o --force-confold , en cuyo caso lo usará para decidir la acción final.

Solo --force-confaskfuncionará, porque explícitamente te hará la pregunta incluso cuando la versión sea la misma. Citando la página man

confask: si se ha modificado un archivo de configuración, siempre ofrezca reemplazarlo con la versión del paquete, incluso si la versión del paquete no cambió (desde dpkg 1.15.8). Si cualquiera de --force-confmiss , --force-confnew , --force-confold o --force-confdef también se proporciona, se utilizará para decidir la acción final.

Espero que eso ayude.

Anwar
fuente
Su respuesta fue muy completa, gracias. ¿También es posible responder automáticamente la pregunta con "y", es decir, efectivamente --force-confnew? Lo intenté apt-get […] -y, pero eso no funcionó. (Si no es posible, edite también la respuesta para decirlo).
Tim Landscheidt
@TimLandscheidt, ¿está preguntando si es posible usarlo --force-confnewsin preguntar? Creo que ese es el caso predeterminado, lo que significa que conservará sus cambios. siempre --force-confaskhace aptla pregunta, de lo contrario, usaría otras opciones si ya conoce la respuesta.
Anwar
1
Ja, lo intenté -o Dpkg::Options::=--force-confnewsin éxito (como tu respuesta predijo) y no leí el mensaje de error cuando lo intenté -o Dpkg::Options::="--force-confask --force-confnew". Sin embargo, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagesobrescribió correctamente los archivos de configuración de cambio de $package. ¡Gracias!
Tim Landscheidt
12

Si el daño ya está hecho, aquí hay una forma de línea de comandos para recuperar la versión oficial del archivo de configuración. Primero, descargue el archivo del paquete (ya sea con el apt-get --download-onlysiguiente, o desde la página del paquete en packages.ubuntu.com ), luego extraiga su contenido en una ubicación temporal. Luego puede copiar el archivo en /etc. Asegúrese de respetar los permisos originales (la mayoría de los archivos /etcson propiedad de root y modo 644 (es decir, legibles por palabras y de escritura de root), pero cada excepción está ahí por una razón 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

Tenga en cuenta que esto no se aplica a los archivos de configuración que no son de un paquete, como /etc/fstabo /etc/passwd. Si pierde estos, está solo. (La mayoría dependen mucho del sistema de todos modos).


Para el futuro, recomiendo usar etckeeper Instalar etckeeper . Instale el paquete y ejecútelo sudo etckeeper init. Esto configura el control de versiones para todos los archivos en /etc. No necesita hacer nada más para administrar etckeeper; solo necesita interactuar con él cuando desea realizar una operación de control de versiones, como hacer referencia a archivos más antiguos. Los archivos se confirman automáticamente antes y después de cada ejecución de apt y todas las noches (esto es configurable).

Por defecto, en Ubuntu, etckeeper usa Bazaar . Cambie la configuración /etc/etckeeper/etckeeper.confantes de ejecutar etckeeper initsi prefiere Darcs, Git o Mercury.

Con Bazaar, para volver /etc/foo.confa la última versión comprometida:

cd /etc
sudo bzr revert foo.conf

Si desea retroceder más en el tiempo, use sudo bzr log foo.confpara ver el historial del archivo, y sudo bzr revert -r 42 foo.confsi ha determinado que revno: 42es la revisión a la que desea volver.

Gilles 'SO- deja de ser malvado'
fuente
7

Puede descargar el paquete manualmente desde packages.ubuntu.com , extraer el archivo y reemplazar su versión con él.

O podrías:

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

El segundo se siente mucho más brutal. También podría borrar otra configuración si usa más de un archivo. El primero es más clics y esfuerzo, pero parece mucho más seguro.

Para el segundo, es posible que pueda eliminar el archivo y - reinstalar podría reemplazarlo. Si es así, eso sería más seguro.

Oli
fuente
2
No, eliminar un archivo de configuración se considera una modificación válida y apt lo conserva.
Ryan C. Thompson
¿Es posible purgar y reinstalar un paquete si otros paquetes instalados dependen de él?
Ryan C. Thompson
@RyanThompson Sí, apt-get --reinstall purge packageno dañará a los dependientes.
Oli
Lamentablemente no funciona.
Anwar
1

Dependiendo del paquete, puede encontrar un archivo de configuración predeterminado en /usr/share/doc/foo/examples.

misterben
fuente
0

Use Synaptic (el ajuste de Ubuntu es aún más conveniente, pero Synaptic es más sencillo) y elija "eliminar completamente el paquete". Esto eliminará todos los archivos de configuración (¡es posible que desee hacer una copia de seguridad de estos archivos!).

Luego reinstalar. Ya terminaste

Con Ubuntu Tweak, obtienes aún más opciones para la limpieza, la renovación y las copias de seguridad de la configuración. Quizás quieras echarle un vistazo. Está en el centro de software.

ps: Synaptic también usa la opción de "purga" (como mencionó anteriormente Oli ...), solo con una GUI para un manejo más cómodo.

piero
fuente
¿Qué paquete elimina archivos en su directorio de inicio cuando lo elimina? ¡Consideraría esto un error grave!
Gilles 'SO- deja de ser malvado'
@Gilles: Tienes razón. La configuración personal dentro de su directorio personal no se verá afectada por la purga. Edité y corregí lo anterior. sry
piedro
Purgar el paquete puede no ser una opción si otros dependen de él.
Ryan C. Thompson
0

Finalmente encontré la respuesta que recordaba vagamente de hace años:

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

El argumento "confnew" obliga a dpkg a reemplazar los archivos de configuración modificados con los proporcionados por el paquete, y el "confmiss" hace lo mismo con los archivos de configuración que se han eliminado.

De acuerdo con este chatlog , también puede usar estas opciones a través de apt-get de la siguiente manera:

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

lo que le ahorra la necesidad de encontrar el archivo deb usted mismo.

Obviamente, estas opciones son peligrosas y tienen el potencial de eliminar archivos de configuración importantes del sistema si se usan incorrectamente.

Ryan C. Thompson
fuente
El problema --force-confnewes que solo instalará nuevos archivos de configuración si la versión cambia. Si está reinstalando la misma versión, no instalará un nuevo archivo de configuración, ya que lo he probado explícitamente
Anwar
Y --force-confmisssolo instalará un nuevo archivo de configuración si se cambia la versión y falta la configuración. Como se describe en la página del manualconfmiss: 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