¿Cómo puedo restaurar los archivos de configuración?

85

Me gustaría restaurar LightDM a su estado predeterminado, porque por alguna razón
/etc/lightdm/unity-greeter.conf ahora es un archivo vacío.

Eliminar /etc/lightdm/unity-greeter.conf y luego ejecutar sudo apt-get install --reinstall unity-greeter no crea un nuevo archivo de configuración como es de esperar.

¿Cómo puedo restaurar un archivo de configuración faltante?

    
pregunta Isaiah 15.10.2011 - 01:42

7 respuestas

123
  1. Descubre qué paquete instaló el archivo de configuración :

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

    Como puede ver, el nombre del paquete es unity-greeter .

    Si eliminó un directorio, como /etc/pam.d , puede enumerar todos los paquetes que se le agregaron utilizando la ruta del directorio:

    $ 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. Cambie el nombre (o elimine) el archivo de configuración que desea restaurar:

    sudo mv -i /etc/lightdm/unity-greeter.conf /etc/lightdm/unity-greeter.conf.bak 
    
  3. Ejecute el siguiente comando, reemplazando <package-name> con el nombre del paquete:

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

    Y para restaurar el directorio:

    sudo apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  4. Si todo funcionó como se esperaba, debería recibir este mensaje:

    Configuration file '/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  5. Un ejemplo práctico cuando se necesita reinstalar todos los archivos de configuración de PulseAudio:

    apt-cache pkgnames pulse |xargs -n 1 apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall 
    
respondido por el Isaiah 15.10.2011 - 20:43
20

En muchos casos, un paquete proporciona directamente el archivo de configuración predeterminado. En tales casos, puede extraer el archivo específico del paquete, recuperando así fácilmente el archivo.

Para verificar si un paquete proporciona el archivo, ejecute dpkg -S en la ruta completa del archivo. Por ejemplo:

$ 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

Proporcionado por un paquete

Como podemos ver, /etc/ssh/sshd_config no es proporcionado directamente por ningún paquete, pero los otros dos son proporcionados por openssh-client y sudo , respectivamente. Entonces, si desea recuperar /etc/ssh/ssh_config , primero obtenga el paquete:

apt-get download openssh-client

Ahora, puede extraer el archivo directamente a su ubicación prevista, o a su ubicación prevista relativa al directorio actual en lugar de / , si desea comparar y contrastar, o manualmente fusionarlos o algo. Para el primero:

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

El -C / dice tar para extraer después de cambiar a / , lo que significa que el archivo objetivo será reemplazado. Si lo elimina, tar se extraerá al directorio actual, lo que significa que ./etc/ssh/ssh_config existirá en su directorio actual.

Si por alguna razón sudo no funciona, use pkexec en su lugar. Si pkexec tampoco funciona, reinicie en modo de recuperación, monte / como rw . Si eso no funciona ...

Creado por un paquete

¿Qué pasa con /etc/ssh/sshd_config ? No parece ser proporcionado por ningún paquete, entonces, ¿cómo apareció?

En este caso (y en muchos otros casos similares, otro ejemplo es /etc/modules ), el archivo se creó utilizando una secuencia de comandos del desarrollador del paquete durante la instalación. Esto a menudo se hace cuando el archivo de configuración necesita ser cambiado debido a las respuestas de los usuarios a las consultas. OpenSSH, por ejemplo, pregunta si PermitRootLogin debe cambiarse a no , en versiones más recientes, entre otras cosas.

Para identificar estos casos, intente explorar los scripts del desarrollador. Normalmente, solo necesitarías mirar postinst , pero si no tienes suerte con postinst , prueba preinst también:

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

En este caso, estamos de suerte:

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

Solo se combinó un archivo, y por suerte, contiene código para crear un archivo de configuración predeterminado :

    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, esto es lo que vería (otro ejemplo, /etc/modules from kmod ):

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

Por lo tanto, puede buscar este código y obtener los contenidos del script directamente.

¿No existe ese script? Todavía puedes intentar hurgar en las listas de archivos de paquetes relacionados para ver si hay algún problema, pero en este punto, no veo ningún método fácilmente generalizable (salvo la reinstalación en entornos transitorios, como un chroot o una VM o un USB vivo).

A la larga, mantenga su configuración bajo control de versiones. Cualquier VCS digno de su sal puede salvar el día aquí, y la utilidad etckeeper simplifica considerablemente la tarea de manteniendo /etc en un VCS.

    
respondido por el muru 22.05.2015 - 16:31
3

De acuerdo con este hilo en los foros de Ubuntu, es tan simple como ejecutar lo siguiente en un terminal:

sudo dpkg-reconfigure lightdm
    
respondido por el Nathan Osman 15.10.2011 - 01:45
2

Encuentra el paquete que posee el archivo de configuración:

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

producirá algo similar a:

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

para que el nombre del paquete sea "unidad-greeter", descargue el paquete:

apt-get download unity-greeter

luego extrae los datos del árbol del sistema de archivos en un archivo tar:

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

finalmente extrae solo esa configuración exacta en cualquier lugar que quieras que sea:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf es el nombre del archivo en nuestro archivo.
  • /etc/lightdm/unity-greeter.conf es donde lo estoy enviando para que se almacene.

O como sugirió @Muru, podemos hacerlo en un trazador de líneas:

dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb |
sudo tar -x -C / ./etc/lightdm/unity-greeter.conf
    
respondido por el Ravexina 06.08.2017 - 22:56
1

Tuve el mismo problema en Ubuntu 17.04. El postinstall usa una plantilla de /usr/share/openssh/ . Comprueba si rootlogin está habilitado o no, establece esta opción y la copia a /etc/ssh . Después de eso, hace algunas llamadas ucf y ucfr (no sé para qué sirve).

Copia /usr/share/openssh/sshd_config a /etc/ssh/sshd_config :

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

Ahora ajusta tu sshd_config como quieras.

    
respondido por el user2162968 27.07.2017 - 14:49
0

Esto no funciona todos los archivos de configuración. Para /etc/nsswitch.conf , consulte Cómo restaurar / recrear etc. / nsswitch.conf archivos . No parece posible reconstruir ese archivo con dpkg-reconfigure .

    
respondido por el Bram Geron 01.11.2017 - 17:35
-1

Elimina (vuelve) el archivo y vuelve a instalar unity-greeter con apt-get install --reinstall unity-greeter .

    
respondido por el RolandiXor 15.10.2011 - 05:54

Lea otras preguntas en las etiquetas