Como posso restaurar arquivos de configuração?

99

Gostaria de restaurar o LightDM ao seu estado padrão, porque, por alguma razão,
/etc/lightdm/unity-greeter.confagora é um arquivo vazio.

Excluir /etc/lightdm/unity-greeter.confe executar sudo apt-get install --reinstall unity-greeternão cria um novo arquivo de configuração, como seria de esperar.

Como posso restaurar um arquivo de configuração ausente?

Isaías
fonte

Respostas:

145
  1. Descubra qual pacote instalou o arquivo de configuração :

    $ dpkg -S unity-greeter.conf
    unity-greeter: /etc/lightdm/unity-greeter.conf
    

    Como você pode ver, o nome do pacote é unity-greeter.

    Se você excluiu um diretório, por exemplo /etc/pam.d, pode listar todos os pacotes adicionados a ele usando o caminho do diretório:

    $ dpkg -S /etc/pam.d
     login, sudo, libpam-runtime, cups-daemon, openssh-server, cron, policykit-1, at, samba-common, ppp, accountsservice, dovecot-core, passwd: /etc/pam.d
    
  2. Execute o seguinte comando, substituindo <package-name>pelo nome do pacote:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" <package-name>
    

    E para restaurar o diretório:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  3. Se tudo funcionou como esperado, você deve receber uma mensagem:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Um exemplo prático ao precisar reinstalar todos os arquivos de configuração do PulseAudio:

    apt-cache pkgnames pulse |xargs -n 1 apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall 
    
Isaías
fonte
3
Obrigado; Eu estive pensando sobre isso por anos. Deve ser realmente mais fácil especificar, no entanto - existe algum bug aberto em algum lugar para isso?
Glyph
4
Eu converti esta resposta a um pequeno script: gist.github.com/jameshfisher/10547691
jameshfisher
5
Um benefício extra de --force-confasksem excluir é que ele oferece mostrar o diferencial entre suas alterações e o original.
Anps
4
Não testado com o Ubuntu, mas sob Debian para restaurar arquivos de configuração que são geridos ucfpela --force-confmissopção não irá funcionar, você tem que usar sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou
Muito estranho que quando usei -o, recebi um erro "dpkg: error: unknown option -o", mas quando usei --option, funcionou. Estou no Ubuntu 16.04.1.
Ryan H.
28

Em muitos casos, o arquivo de configuração padrão é fornecido diretamente por um pacote. Nesses casos, você pode extrair o arquivo específico do pacote, recuperando facilmente o arquivo.

Para verificar se um pacote fornece o arquivo, execute dpkg -So caminho completo do arquivo. Por exemplo:

$ dpkg -S /etc/ssh/sshd_config /etc/ssh/ssh_config /etc/sudoers
dpkg-query: no path found matching pattern /etc/ssh/sshd_config
openssh-client: /etc/ssh/ssh_config
sudo: /etc/sudoers

Fornecido por um pacote

Como podemos ver, /etc/ssh/sshd_confignão é fornecido diretamente por nenhum pacote, mas os outros dois são fornecidos por openssh-cliente sudorespectivamente. Portanto, se você deseja se recuperar /etc/ssh/ssh_config, primeiro obtenha o pacote:

apt-get download openssh-client

Agora, você pode extrair o arquivo diretamente para o local pretendido ou para o local pretendido em relação ao diretório atual em vez de /, se desejar comparar e contrastar, ou mesclá-los manualmente ou algo assim. Para o primeiro:

dpkg-deb --fsys-tarfile openssh-client_*.deb | sudo tar x ./etc/ssh/ssh_config -C /

As -C /instruções tarpara extrair após a alteração para /, o que significa que o arquivo de destino será substituído. Se você removê-lo, tarserá extraído para o diretório atual, o significado ./etc/ssh/ssh_configexistirá no diretório atual.

Se, por algum motivo sudo, não funcionar, use-o pkexec. Se pkexecnão funcionar, reinicie no modo de recuperação, monte /como rw. Se isso não funcionar ...


Criado por um pacote

Que tal /etc/ssh/sshd_config? Ele não parece ser fornecido por nenhum pacote, então como ele apareceu?

Nesse caso (e em muitos outros casos, sendo outro exemplo /etc/modules), o arquivo foi criado usando um script de mantenedor de pacotes durante a instalação. Isso geralmente é feito quando o arquivo de configuração precisa ser alterado devido às respostas do usuário às consultas. O OpenSSH, por exemplo, pergunta se PermitRootLogindeve ser alterado para no, em versões mais recentes, entre outras coisas.

Para identificar esses casos, tente percorrer os scripts do mantenedor. Normalmente, você só precisa procurar postinst, mas se não tiver sorte postinst, tente preinsttambém:

grep -l /etc/ssh/sshd_config /var/lib/dpkg/info/*.postinst

Nesse caso, estamos com sorte:

$ grep /etc/ssh/sshd_config /var/lib/dpkg/info/*.postinst -l
/var/lib/dpkg/info/openssh-server.postinst

Apenas um arquivo correspondeu e, por sorte, ele contém código para criar um arquivo de configuração padrão :

    cat <<EOF > /etc/ssh/sshd_config
# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes

# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768

# Logging
SyslogFacility AUTH
LogLevel INFO

# Authentication:
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys

# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes

# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no

#MaxStartups 10:30:60
#Banner /etc/issue.net

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

Subsystem sftp /usr/lib/openssh/sftp-server

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
EOF

Normalmente, é isso que você veria (outro exemplo, /etc/modulesdekmod ):

cat > /path/to/the/file <<EOF
# default contents
EOF

Portanto, você pode procurar esse código e obter o conteúdo diretamente do script.


Não existe esse script? Você ainda pode tentar vasculhar as listas de arquivos de pacotes relacionados para ver se alguma coisa ocorre, mas, neste momento, não vejo um método facilmente generalizável (com pouca reinstalação em ambientes transitórios, como um chroot, uma VM ou um USB ativo).


A longo prazo, mantenha sua configuração sob controle de versão. Qualquer VCS que se preze pode salvar o dia aqui, e o etckeeperutilitário simplifica consideravelmente a tarefa de se manter /etcem um VCS.

muru
fonte
3

De acordo com esta discussão nos fóruns do Ubuntu, é tão simples quanto executar o seguinte em um terminal:

sudo dpkg-reconfigure lightdm
Nathan Osman
fonte
1
Corri esse comando e esta foi a saída: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. O LightDM também não foi restaurado para sua configuração original.
Isaías
@DoR: Hm ... isso é estranho. Está reinstalando o pacote uma opção.
Nathan Osman
Eu o reinstalei ( sudo apt-get --reinstall install lightdm) e ainda /etc/lightdm/unity-greeter.confestá vazio.
Isaiah
1
Este é um conselho comum, mas definitivamente errado; não funciona na maioria dos casos em que experimentei.
Glyph
2

Encontre o pacote que possui o arquivo de configuração:

dpkg --search /etc/path/to/config

ele produzirá algo semelhante a:

unity-greeter: /etc/lightdm/unity-greeter.conf

para que o nome do pacote seja "unity-greeter", faça o download do pacote:

apt-get download unity-greeter

extraia seus dados da árvore do sistema de arquivos para um arquivo tar:

dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb > pkg.tar

por fim, extraia apenas a configuração exata em qualquer lugar que você desejar:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf é o nome do arquivo em nosso arquivo.
  • /etc/lightdm/unity-greeter.conf é para onde estou enviando para ser armazenado.

Ou, como o @Muru sugeriu, podemos fazer isso de uma só vez:

dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb |
sudo tar -x -C / ./etc/lightdm/unity-greeter.conf
Ravexina
fonte
1
Se você está simplesmente restaurá-lo de volta para onde ele pertence, fazer dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, então tarvai cd para /antes de extrair.
muru 7/08/19
@muru adicionado como alternativa;)
Ravexina
Sempre deixe um comentário quando estiver baixando a votação ...
Ravexina 13/10
1

Eu tive o mesmo problema no Ubuntu 17.04. A pós-instalação usa um modelo de /usr/share/openssh/. Ele verifica se o rootlogin está ativado ou não, define essa opção e a copia para /etc/ssh. Depois disso, ele faz algumas chamadas ucf e ucfr (não sei para que serve isso).

Basta copiar /usr/share/openssh/sshd_configpara /etc/ssh/sshd_config:

sudo cp /usr/share/openssh/sshd_config /etc/ssh/sshd_config

Agora ajuste o seu sshd_configcomo quiser.

user2162968
fonte
0

Isso não funciona em todos os arquivos de configuração. Para /etc/nsswitch.conf, consulte Como restaurar / recriar arquivos etc / nsswitch.conf . Não parece possível reconstruir esse arquivo com dpkg-reconfigure.

Bram Geron
fonte
Eu sei que a pergunta original era sobre LightDM, mas, aparentemente, os administradores decidiram que esta questão é sobre todos os arquivos de configuração
Bram Geron
-1

Exclua (volte) o arquivo e reinstale-o unity-greetercom apt-get install --reinstall unity-greeter.

RolandiXor
fonte
1
Isso não restaura os arquivos de configuração.
starbeamrainbowlabs