Obter alterações diferenciais entre os arquivos originais instalados com os arquivos apt e atual

19

Eu instalei o php5-fpmpacote usando apt; então eu fiz algumas alterações nos arquivos de configuração do PHP.

Agora eu obteria as diferenças entre as versões dos arquivos originais (as do pacote instalado) e as versões atuais (modificadas por mim). Como fazer isso?

mdesantis
fonte
É difícil entender o que exatamente você quer saber. Nem sequer está claro qual é a sua situação.
Hauke Laging
Eu não sei se apt posso te dizer isso, mas o que eu recomendo é colocar /etcsob controle de revisão (eu uso mercurial para isso) e adde commitem uma base regular. Dessa forma, você pode reverter para os arquivos originais ou para intermediar os estados alterados e com hg diffvocê pode ver as alterações. Se você não conseguir encontrar uma maneira de fazer isso apt, faça backup dos arquivos alterados, reinstale os pacotes, coloque os arquivos de configuração sob controle de revisão e copie suas alterações. Depois disso, você pode fazer uma comparação.
Anthon
@HaukeLaging Eu não sou bom em Inglês, me desculpe
mdesantis
Duplicado de superuser.com/questions/10997/…
reinierpost
11
@reinierpost não, não é. Eu quero as diferenças.
precisa saber é o seguinte

Respostas:

12

Tente algo como isto:

# 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

Conforme sugerido por outras pessoas, definitivamente coloque seus arquivos de configuração sob controle de revisão. Dessa forma, você pode ver exatamente o que mudou e quando mudou.

rubo77
fonte
Obrigado! Eu tive que modificar um pouco o código: gist.github.com/ProGNOMmers/5404609 se você atualizar sua pergunta com código de trabalho eu vou ser feliz em aceitá-la
mdesantis
Estou feliz que minha solução funcionou para você. Incluí suas alterações e correções no meu código.
2
tar xzf data.tar.gzdeve ser tar xf data.tar.xzpara o Ubuntu recente
Znarkus
3
Você poderia usar em dpkg-deb -x ${package}_*.deb .vez de usar are tar. Além disso apt-get download $(dpkg-query -W -f='${binary:Package}=${Version}' $package), certifique-se de pegar a versão atualmente instalada, e não a mais recente, por exemplo, se você estiver fazendo isso antes de fazer uma atualização.
19417 pix
Corrigi um erro em que não há data.tar.gz, mas data.tar.xz github.com/rubo77/apt-etc-diff - também aprimorou um pouco o script
rubo77 27/11
8

diretório etc

Para rastrear alterações em seu /etcdiretório, você pode fazer o que o @Anthon sugeriu e usar git, subversion, mercurial etc. para controlar a versão desse diretório. Você também pode usar uma ferramenta como o etckeeper . Há um tutorial aqui e aqui .

O etckeeper é uma coleção de ferramentas para permitir que o / etc seja armazenado em um repositório git, mercurial, bazar ou darcs. Ele se conecta ao apt para confirmar automaticamente as alterações feitas no / etc durante as atualizações do pacote. Ele rastreia os metadados de arquivo aos quais o git normalmente não suporta, mas isso é importante para o / etc, como as permissões de /etc/shadow. É bastante modular e configurável, além de ser simples de usar, se você entender o básico de como trabalhar com controle de versão.

arquivos de pacote

Que eu saiba aptnão tem como verificar os arquivos no disco x os arquivos que estão no real .deb. Nem dpkga ferramenta queapt realmente está usando para gerenciar os arquivos.

No entanto, você pode usar uma ferramenta como debsumsa de comparar alguns dos arquivos que você instalou, mas apenas analisa as somas de verificação (md5sum) do conteúdo da.deb arquivo x do disco do sistema.

Veja esta questão de falha do servidor para obter mais detalhes sobre debsume dpkgsoma de verificação, bem como esta questão do askubuntu .

debsum exemplo

% 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
fonte
muito obrigado! Eu não sabia sobre a prática de manter o /etccontrole de revisão e etckeeperparece a solução certa para gerenciá-la; Vou adotá-lo
mdesantis
2
Observe que o OP precisará ser executado debsums -a, caso contrário, os arquivos de configuração serão excluídos da verificação.
Dmitry Grigoryev
11
O @DmitryGrigoryev debums -ceé perfeito para encontrar quais arquivos (de configuração) procurar.
0xC0000022L
6

Eu escrevi o seguinte script simples para recuperar automaticamente o arquivo original do pacote Debian correto e diferenciar o arquivo atual: https://a3nm.net/git/mybin/tree/debdiffconf

Use-o da seguinte maneira: 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
fonte
Seu script também requer o realpathpacote instalado.
Mxx #
@Mxx: obrigado, adicionando uma verificação para este pacote, embora a partir do Debian jessie pareça que o coreutils esteja fornecendo um comando `realpath '.
a3nm
Estava faltando no Ubuntu.
Mxx #
Aqui está o meu.
reinierpost
11
Infelizmente, isso funciona apenas para pacotes que vêm de repositórios com um arquivo de conteúdo. Caso contrário, excelente roteiro!
precisa saber é o seguinte
0

Se você quiser ver as diferenças entre o php.iniarquivo original e o instalado , use

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

se você não se importa com as linhas de comentário, insira-o

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