Obtenga cambios de diferencias entre los archivos originales instalados con apt y los archivos actuales

19

Instalé el php5-fpmpaquete usando apt; Luego hice algunos cambios en los archivos de configuración de PHP.

Ahora obtendría las diferencias entre las versiones de los archivos originales (las del paquete instalado) y las versiones actuales (modificadas por mí). ¿Cómo hacerlo?

mdesantis
fuente
Es difícil entender qué es exactamente lo que quieres saber. Ni siquiera está claro cuál es su situación.
Hauke ​​Laging
No sé si apt puede decirte eso, pero lo que sí recomiendo es poner /etcbajo control de revisión (uso mercurial para eso) addy commitde forma regular. De esa manera, puede volver a los archivos originales o a los estados intermedios modificados y con ellos hg diffpuede ver los cambios. Si no puede encontrar una manera de hacerlo apt, haga una copia de seguridad de sus archivos modificados, reinstale los paquetes, coloque los archivos de configuración bajo control de revisión y vuelva a copiar sus cambios. Después de eso puedes hacer un diff.
Anthon
@HaukeLaging No soy bueno en inglés, lo siento
mdesantis
Duplicado de superuser.com/questions/10997/...
reinierpost
1
@reinierpost no, no lo es. Quiero los diffs.
mdesantis

Respuestas:

12

Intenta algo como esto:

# exit on failure
set -e

package=php5-fpm
mkdir $package
cd $package

# you could also get the file from a package mirror if you have
#  an older version of apt-get that doesn't support 'download' 
#  or if you would like more control over what package version
#  you are downloading.
# (e.g. http://archive.ubuntu.com/ubuntu/pool/main/)
apt-get download $package

# deb package files are ar archives
ar vx ${package}*.deb
# containing some compressed tar archives
tar xzf data.tar.gz
# now you have the files

# you can get diffs for all of the files in etc if you would like
find etc -type f |
while read file ; do
    diff $file /$file
done

Según lo sugerido por otros, definitivamente ponga sus archivos de configuración bajo control de revisión. De esa manera, puede ver exactamente qué cambió y cuándo lo cambió.

rubo77
fuente
¡Gracias! Tuve que modificar un poco el código: gist.github.com/ProGNOMmers/5404609 si actualiza su pregunta con el código de trabajo, estaré encantado de aceptarlo
mdesantis
Me alegra que mi solución haya funcionado para ti. He incluido sus cambios y correcciones en mi código.
2
tar xzf data.tar.gzdebería ser tar xf data.tar.xzpara Ubuntu reciente
Znarkus
3
Podrías usar en dpkg-deb -x ${package}_*.deb .lugar de usar ary tar. También apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package)se asegurará de obtener la versión instalada actualmente en lugar de la última, por ejemplo, si está haciendo esto justo antes de realizar una actualización.
pix
Solucioné un error donde no hay data.tar.gz pero data.tar.xz github.com/rubo77/apt-etc-diff - también mejoré un poco el script
rubo77
8

directorio etc.

Para realizar un seguimiento de los cambios en su /etcdirectorio, puede hacer lo que @Anthon ha sugerido y usar git, subversion, mercurial, etc. para controlar la versión de ese directorio. También puede usar una herramienta como etckeeper . Hay un tutorial aquí , así como aquí .

etckeeper es una colección de herramientas para permitir que / etc se almacene en un repositorio git, mercurial, bazar o darcs. Se conecta a apt para confirmar automáticamente los cambios realizados en / etc durante las actualizaciones de paquetes. Realiza un seguimiento de los metadatos de archivo que git normalmente no admite, pero eso es importante para / etc, como los permisos de /etc/shadow. Es bastante modular y configurable, a la vez que es fácil de usar si comprende los conceptos básicos de trabajar con el control de versiones.

archivos de paquete

Que yo sepa aptno tiene una forma de verificar los archivos en el disco frente a los archivos que están en el real .deb. Tampoco lo hace dpkg, la herramienta que aptrealmente está utilizando para administrar los archivos.

Sin embargo, puede usar una herramienta como debsumspara comparar algunos de los archivos que ha instalado, solo mira sus sumas de comprobación (md5sum) de lo que hay en el .debarchivo y lo que está en el disco de su sistema.

Consulte esta pregunta predeterminada del servidor para obtener más detalles debsumy dpkgsumas de comprobación, así como esta pregunta de askubuntu .

debsum ejemplo

% debsums openssh-server
/usr/lib/openssh/sftp-server                                                  OK
/usr/sbin/sshd                                                                OK
/usr/share/lintian/overrides/openssh-server                                   OK
/usr/share/man/man5/sshd_config.5.gz                                          OK
/usr/share/man/man8/sshd.8.gz                                                 OK
/usr/share/man/man8/sftp-server.8.gz                                          OK
slm
fuente
¡muchas gracias! No sabía sobre la práctica de mantener /etcbajo control de revisión, y etckeeperparece la solución correcta para administrarlo; Lo
adoptaré
2
Tenga en cuenta que el OP deberá ejecutarse debsums -a; de lo contrario, los archivos de configuración se excluirán de la verificación.
Dmitry Grigoryev
1
@DmitryGrigoryev debums -cees perfecto para encontrar qué archivos (de configuración) mirar.
0xC0000022L
6

Escribí el siguiente script simple para recuperar automáticamente el archivo original del paquete de Debian correcto y diferenciar el archivo actual: https://a3nm.net/git/mybin/tree/debdiffconf

Úselo de la siguiente manera: debdiffconf FILE

#!/bin/bash

# Usage: debdiffconf.sh FILE
# Produce on stdout diff of FILE against the first installed Debian package
# found that provides it.
# Returns the exit code of diff if everything worked, 3 or 4 otherwise.

# /programming//a/4785518
command -v apt >/dev/null 2>&1 || {
  echo "apt not found, this is probably not a Debian system. Aborting." >&2;
  exit 4; }
command -v apt-file >/dev/null 2>&1 || {
  echo "Please install apt-file: sudo apt install apt-file. Aborting." >&2;
  exit 4; }
command -v realpath >/dev/null 2>&1 || {
  echo "Please install realpath: sudo apt install realpath. Aborting." >&2;
  exit 4; }

FILE=$(realpath -m "$1")
while read PACKAGE
do
  # verify from first installed package
  if dpkg-query -W --showformat='${Status}\n' | grep installed > /dev/null
  then
    DIR=$(mktemp -d)
    cd "$DIR"
    echo "Trying $PACKAGE..." >&2
    apt download "$PACKAGE" >&2
    # downloaded archive is the only file present...
    ARCHIVE=$(ls)
    mkdir contents
    # extract entire archive
    dpkg-deb -x "$ARCHIVE" contents/ >&2
    if [ -f "contents$FILE" ]
    then
      # package contained required file
      diff "contents$FILE" "$FILE"
      RET=$?
      # cleanup
      cd
      rm -Rf "$DIR"
      # exit entire script as this is the main shell
      # with the return code from diff
      exit $RET
    else
      # cleanup
      cd
      rm -Rf "$DIR"
    fi
  fi
done < <(apt-file -l search "$FILE")
# if we are here, it means we have found no suitable package
echo "Could not find original package for $FILE" >&2
exit 3
a3nm
fuente
Su script también requiere un realpathpaquete instalado.
Mxx
@Mxx: gracias, agregando un cheque para este paquete, aunque comenzando con Debian jessie parece que coreutils está proporcionando un comando 'realpath'.
a3nm
Faltaba en Ubuntu.
Mxx
Aqui esta el mio
reinierpost
1
Desafortunadamente, esto solo funciona para paquetes que provienen de repositorios con un archivo de Contenido. De lo contrario, excelente guión!
Martijn Pieters
0

Si desea ver las diferencias entre el php.iniarchivo original y el instalado , use

diff -W COLUMNS --suppress-common-lines -y /usr/share/php5/php.ini-development /etc/php5/apache2/php.ini -W $COLUMNS

si no te importan las líneas de comentarios, canalízalo

| egrep -v '^;.*<$|\s*>.;.*|;.*\|.;'
rubo77
fuente