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


98

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

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

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

Respuestas:


144
  1. Descubra 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 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. Ejecute el siguiente comando, reemplazando <package-name>con el nombre del paquete:

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

    Y para restaurar el directorio:

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

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Un ejemplo práctico cuando 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 
    

3
Gracias; Me he estado preguntando sobre esto por años. Sin embargo, debería ser más fácil de especificar: ¿hay algún error abierto en alguna parte para eso?
Glifo


55
Un beneficio adicional de --force-confasksin eliminar es que ofrece mostrar la diferencia entre sus cambios y el original.
anps

44
No se ha probado con Ubuntu, pero en Debian para restaurar los archivos de configuración que son administrados por ucfla --force-confmissopción no funcionará, debe usar sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou

Muy extraño que cuando lo usé -orecibí un error "dpkg: error: unknown option -o" pero cuando lo usé --optionfuncionó. Estoy en Ubuntu 16.04.1.
Ryan H.

27

Para muchos casos, el archivo de configuración predeterminado lo proporciona un paquete directamente. 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 -Sen 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_configningún paquete lo proporciona directamente, pero los otros dos son proporcionados por openssh-clienty sudorespectivamente. Entonces, si desea recuperarse /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 hacerlo /, si desea comparar y contrastar, o fusionarlos manualmente o algo así. Para el primero:

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

Le -C /dice tara extraer después de cambiar a /, lo que significa que el archivo de destino será reemplazado. Si lo elimina, tarextraerá el directorio actual, lo ./etc/ssh/ssh_configque significa que existirá en su directorio actual.

Si por alguna razón sudono funciona, use pkexecen su lugar. Si pkexectampoco funciona, reinicie en modo de recuperación, monte /como rw. Si eso no funciona ...


Creado por un paquete

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

En este caso (y en muchos otros casos, siendo otro ejemplo /etc/modules), el archivo se creó usando un script de mantenimiento de paquetes durante la instalación. Esto a menudo se hace cuando el archivo de configuración necesita ser cambiado debido a las respuestas del usuario a las consultas. OpenSSH, por ejemplo, pregunta si PermitRootLogindebería cambiarse a no, en versiones más nuevas, entre otras cosas.

Para identificar tales casos, intente recorrer los guiones del mantenedor. Por lo general, solo necesitaría mirar postinst, pero si no tiene suerte postinst, intente preinsttambié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 un archivo coincidió 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

Por lo general, esto es lo que vería (otro ejemplo, /etc/modulesdekmod ):

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

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


No hay tal guión? Todavía puede intentar revisar las listas de archivos de paquetes relacionados para ver si algo golpea, pero en este punto, no veo un método fácilmente generalizable (salvo la reinstalación en entornos transitorios, como un chroot o una VM o un USB en vivo).


A la larga, mantenga su configuración bajo control de versiones. Cualquier VCS que valga la pena puede salvar el día aquí, y la etckeeperutilidad simplifica considerablemente la tarea de mantener /etcun VCS.


3

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

sudo dpkg-reconfigure lightdm

1
Me encontré con ese comando y este fue el resultado: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. LightDM tampoco fue restaurado a su configuración original.
Isaías

@DoR: Hm ... eso es extraño. Es reinstalar el paquete una opción.
Nathan Osman

Lo reinstalé ( sudo apt-get --reinstall install lightdm) y todavía /etc/lightdm/unity-greeter.confestá vacío.
Isaías

1
Este es un consejo común, pero definitivamente está mal; no funciona para la mayoría de los casos, lo he probado.
Glifo

2

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

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

generará algo similar a:

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

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

apt-get download unity-greeter

luego extraiga 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 extraiga solo esa configuración exacta en cualquier lugar que desee 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 envío para ser almacenado.

O como sugirió @Muru, podemos hacerlo de una sola vez:

dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb |
sudo tar -x -C / ./etc/lightdm/unity-greeter.conf

1
Si simplemente lo está restaurando a donde pertenece, haga dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, así tarque cd /antes de extraerlo.
muru

@muru agregado como alternativa;)
Ravexina

Siempre deje un comentario cuando
rechace la

1

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

Solo copia /usr/share/openssh/sshd_configa /etc/ssh/sshd_config:

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

Ahora ajusta tu sshd_configcomo quieras.



-1

Elimine (vuelva) el archivo y vuelva a instalarlo unity-greetercon apt-get install --reinstall unity-greeter.


1
Esto no restaura los archivos de configuración.
starbeamrainbowlabs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.