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

24

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

Por uma questão de argumento, digamos que eu quero reverter o arquivo /etc/foo.confdo pacote foo.

Ryan C. Thompson
fonte
2
Para todos aqueles que sugerem a remoção e a reinstalação foo, e se bardepender fooe eu não quiser removê-lo bar?
Ryan C. Thompson

Respostas:

15

A resposta fornecida por Ryan Thomson estava indo para o caminho certo. Ainda assim, não seria capaz de fazer o trabalho (o motivo é detalhado abaixo).

A maneira correta (e mais fácil) de fazer isso é usar -ocom apta opção pass dpkg e forçar dpkga 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é pressionar D para ver quais são as alterações ou iniciar um shell raiz com a opção Z para se corrigir.

Nota: Após a substituição, você encontrará o arquivo modificado comoat /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 tratam dos arquivos de configuração de um pacote são

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

--force-confmissnão funcionaria quando a versão do pacote não fosse alterada. Da página de manual

Se um conffile foi modificado e a versão no pacote mudou, sempre instale a nova versão sem avisar, a menos que o --force-confdef também esteja especificado, nesse caso a ação padrão é preferida.

--force-confmissfunciona com arquivos de configuração ausentes. Também falhará quando a versão não for alterada. Citando a página de manual

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

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

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

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

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

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

confask: Se um conffile foi modificado, sempre ofereça-o para substituí-lo pela versão no pacote, mesmo que a versão no pacote não tenha sido alterada (desde o dpkg 1.15.8). Se alguma das opções --force-confmiss , --force-confnew , --force-confold ou --force-confdef também for fornecida, ela será usada para decidir a ação final.

Espero que ajude.

Anwar
fonte
Sua resposta foi muito abrangente, obrigado. Também é possível responder automaticamente à pergunta com "y", ou seja, efetivamente --force-confnew? Eu tentei apt-get […] -y, mas isso não funcionou. (Se não for possível, edite também a resposta para dizê-lo.) #
432 Tim Landscheidt
@TimLandscheidt você está perguntando se é possível usar --force-confnewsem perguntar? Eu acho que é o caso padrão, o que significa que ele manterá suas alterações. --force-confaskfaz aptsempre a pergunta; caso contrário, você usaria outras opções se já souber a resposta.
Anwar
1
Ha, eu tentei -o Dpkg::Options::=--force-confnewsem sucesso (como sua resposta previu) e não li a mensagem de erro quando tentei -o Dpkg::Options::="--force-confask --force-confnew". No entanto, apt-get --reinstall -o Dpkg::Options::=--force-confask -o Dpkg::Options::=--force-confnew install $packagesubstitua corretamente os arquivos de configuração de alteração de $package. Obrigado!
precisa
12

Se o dano já estiver feito, eis uma maneira de recuperar a versão oficial do arquivo de configuração. Primeiro, baixe o arquivo do pacote ( apt-get --download-onlycomo abaixo, ou na página do pacote packages.ubuntu.com ) e depois extraia seu conteúdo em um local temporário. Você pode copiar o arquivo para /etc. Certifique-se de respeitar as permissões originais (a maioria dos arquivos /etcpertence ao root e ao modo 644 (isto é, legível por palavras e gravável por raiz), mas cada exceção existe 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 pertencem a um pacote, como /etc/fstabou /etc/passwd. Se você os perder, estará por sua conta. (A maioria é muito dependente do sistema).


Para o futuro, eu recomendo usar o etckeeper Instale o etckeeper . Instale o pacote e execute sudo etckeeper init. Isso configura o controle de versão para todos os arquivos /etc. Você não precisa fazer mais nada para gerenciar o etckeeper; você só precisa interagir com ele quando desejar executar uma operação de controle de versão, como consultar 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 Bazaar . Altere a configuração /etc/etckeeper/etckeeper.confantes de executar, etckeeper initse você preferir Darcs, Git ou Mercury.

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

cd /etc
sudo bzr revert foo.conf

Se você quiser voltar mais no tempo, use sudo bzr log foo.confpara exibir o histórico do arquivo e sudo bzr revert -r 42 foo.confse tiver determinado que revno: 42é a revisão à qual deseja reverter.

Gilles 'SO- parar de ser mau'
fonte
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 cliques e esforço, mas parece muito mais seguro.

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

Oli
fonte
2
Não, a exclusão de um arquivo de configuração é considerada uma modificação válida e é preservada pelo apt.
Ryan C. Thompson
É possível limpar e reinstalar um pacote se outros pacotes instalados dependerem dele?
23912 Ryan Ryan Thompson
@RyanThompson Sim, apt-get --reinstall purge packagenão machucará dependentes.
Oli
Infelizmente isso não funciona.
Anwar
1

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

misterben
fonte
0

Use Synaptic (o ajuste 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 fazer backup desses arquivos!).

Então reinstale. Você está feito.

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

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

piedro
fonte
Qual pacote remove arquivos no seu diretório pessoal quando você o remove? Eu consideraria isso um erro grave!
Gilles 'SO- stop be evil'
@Gilles: Você está certo. As configurações pessoais no diretório inicial não serão afetadas pela limpeza. Eu editei e corrigi o acima. sry
Piedro
Limpar o pacote pode não ser uma opção se outros dependerem dele.
23912 Ryan Ryan Thompson
0

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 excluídos.

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

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

o que evita que você precise encontrar o arquivo deb por conta própria.

Obviamente, essas opções são perigosas e têm o potencial de remover arquivos importantes de configuração do sistema se forem mal utilizados.

Ryan C. Thompson
fonte
O problema --force-confnewé que ele só instalará novos arquivos de configuração se a versão for alterada. Se você estiver reinstalando mesma versão, ele não vai instalar um novo arquivo de configuração como eu testei explicitamente
Anwar
E --force-confmisssó instalará um novo arquivo de configuração se a versão for alterada e a configuração estiver ausente. Conforme descrito na página do 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