Como posso reverter um arquivo de configuração para a versão originalmente instalada depois de editá-lo?

22

Eu quero reverter um arquivo em /etc/ de volta para o formulário originalmente instalado. Eu editei o arquivo desde que ele foi instalado. Como posso reverter este arquivo de configuração? Apt é inteligente o suficiente não para sobrescrever arquivos de configuração editados, então como eu digo que eu quero que ele faça isso?

Para argumentar, digamos que eu queira reverter o arquivo /etc/foo.conf do pacote foo .

    
por Ryan Thompson 11.11.2010 / 17:55

6 respostas

12

A resposta fornecida por Ryan Thomson estava indo para o caminho certo. Ainda não seria capaz de fazer o trabalho (A razão detalhes é dada abaixo).

A maneira correta (e mais fácil) de fazer isso é usar -o com apt para passar a opção dpkg e forçar dpkg a perguntar se você deseja manter os arquivos de configuração modificados ou os originais. O comando será assim -

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

Isso faria uma pergunta 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] ? 

Você precisa pressionar Y ou I para instalar o arquivo de configuração original do mantenedor do pacote. Você pode até mesmo pressionar D para ver quais são as mudanças ou iniciar um shell de root com a opção Z para corrigir você mesmo.

Observação: Após a substituição, você encontrará o arquivo modificado como at /etc/foo/foo.conf.dpkg-old

Por que outras opções não funcionariam?

Porque as outras opções no dpkg não funcionam bem. As opções que lida com os arquivos de configuração de um pacote são

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

--force-confmiss não funcionaria quando a versão do pacote não muda. De man-page

  
    

Se um conffile foi modificado e a versão do pacote foi alterada, sempre instale a nova versão sem avisar, a menos que o - force-confdef também seja especificado. Nesse caso, a ação padrão é o preferido.

  

--force-confmiss funciona com conffiles ausentes. Também irá falhar quando a versão não mudar. Citando página de manual

  
    

confmiss: Se um conffile estiver faltando e a versão do pacote for alterada, sempre instale o conffile ausente sem avisar. Isso é perigoso, pois significa não preservar uma alteração (remoção) feita no arquivo

  

--force-confold manterá a versão modificada somente se a versão for alterada . Para o mesmo pacote, também irá falhar. Citando página de manual

  
    

confold: Se um conffile foi modificado e a versão do pacote foi alterada, sempre mantenha a versão antiga sem avisar, a menos que o - force-confdef também seja especificado. a ação padrão é preferida.

  

--force-confdef também falhará porque a ação padrão é manter o arquivo mais antigo (indicado na mensagem mostrada com --force-confask . Ele possui a linha (Y/I/N/O/D/Z) [default=N] , o que significa que a retenção é padrão. Consulte acima ). E se --force-confnew for especificado, mas a versão não for alterada, isso também não funcionará. Citando página de manual

  
    

confdef: Se um conffile foi modificado e a versão do pacote foi alterada, sempre escolha a ação padrão sem avisar. Se não houver nenhuma ação padrão, ela será interrompida para perguntar ao usuário, a menos que - force-confnew ou - force-confold também seja fornecido. Nesse caso, ele será usado que para decidir a ação final.

  

Apenas --force-confask funcionará, porque ele fará a pergunta explicitamente, mesmo quando a versão for a mesma. Citando página de manual

  
    

confask: Se um conffile tiver sido modificado, sempre ofereça substituí-lo pela versão do pacote, mesmo que a versão do pacote não tenha mudado (desde o dpkg 1.15.8). Se algum dos - força-confiscar , - força-confnew , - força-confold , ou - força- confdef também é dado, ele será usado para decidir a ação final.

  

Espero que isso ajude.

    
por Anwar 28.08.2016 / 11:18
12

Se o dano já estiver feito, aqui está uma forma de linha de comando de recuperar a versão oficial do arquivo de configuração. Primeiro, baixe o arquivo do pacote (com apt-get --download-only como abaixo, ou da página do pacote em packages.ubuntu.com ), então extrair seu conteúdo em um local temporário. Você pode então copiar o arquivo em /etc . Certifique-se de respeitar as permissões originais (a maioria dos arquivos em /etc é de propriedade de root e modo 644 (isto é, legível por palavra e gravável por raiz), mas cada exceção está lá por um motivo 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

Observe que isso não se aplica aos arquivos de configuração que não são de um pacote, como /etc/fstab ou /etc/passwd . Se você perder isso, estará sozinho. (A maioria é muito dependente do sistema).

Para o futuro, recomendo usar o etckeeper . Instale o pacote e execute sudo etckeeper init . Isso configura o controle de versão para todos os arquivos em /etc . Você não precisa fazer mais nada para gerenciar o etckeeper; você só precisa interagir com ele quando quiser fazer uma operação de controle de versão, como referir-se a arquivos mais antigos. Os arquivos são automaticamente confirmados antes e depois de cada execução do apt e todas as noites (isso é configurável).

Por padrão, no Ubuntu, o etckeeper usa o Bazar . Altere a configuração em /etc/etckeeper/etckeeper.conf antes de executar etckeeper init se você preferir Darcs, Git ou Mercury.

Com o Bazaar, para reverter /etc/foo.conf para a última versão confirmada:

cd /etc
sudo bzr revert foo.conf

Se você quiser voltar mais a tempo, use sudo bzr log foo.conf para ver o histórico do arquivo e sudo bzr revert -r 42 foo.conf se você determinou que revno: 42 é a revisão à qual você deseja reverter.

    
por Gilles 11.11.2010 / 20:43
7

Você pode baixar o pacote manualmente em packages.ubuntu.com , extrair o arquivo e substituir sua versão por ele.

Ou você pode:

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

O segundo parece muito mais brutal. Também pode apagar outras configurações se usar mais de um arquivo. O primeiro é mais clicando e esforço, mas parece muito mais seguro.

Para o segundo, você pode excluir apenas o arquivo e --reinstall pode substituí-lo. Se assim for, isso seria mais seguro.

    
por Oli 11.11.2010 / 18:02
1

Dependendo do pacote, você pode encontrar um arquivo de configuração padrão em /usr/share/doc/foo/examples .

    
por misterben 11.11.2010 / 19:12
0

Use o Synaptic (o tweak do Ubuntu é ainda mais conveniente, mas o synaptic é mais direto) e escolha "remover completamente o pacote". Isso excluirá todos os arquivos de configuração (você pode querer fazer backup desses arquivos!).

Em seguida, reinstale. Você está feito.

Com o Ubuntu Tweak você obtém ainda mais opções para backups de limpeza, rolagem e configuração. Talvez você queira dar uma olhada. Está no softwarecenter.

p.s .: Synaptic também usa a opção "purge" (como mencionado por Oli acima ...) - apenas com uma GUI para um manuseamento mais confortável.

    
por piedro 11.11.2010 / 19:49
0

Eu finalmente encontrei a resposta que me lembrava vagamente de anos atrás:

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

O argumento "confnew" força o dpkg a substituir os arquivos de configuração modificados pelos fornecidos pelo pacote, e o "confmiss" faz o mesmo com os arquivos de configuração que foram deletados.

De acordo com este chatlog , você também pode usar essas opções através do apt-get no da seguinte maneira:

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

que evita que você precise encontrar o arquivo deb você mesmo.

Obviamente, essas opções são perigosas e têm o potencial de eliminar arquivos importantes de configuração do sistema, se usados de maneira inadequada.

    
por Ryan Thompson 28.08.2012 / 02:18