Come posso ripristinare i file di configurazione?


99

Vorrei ripristinare LightDM al suo stato predefinito, perché per qualche motivo
/etc/lightdm/unity-greeter.confora è un file vuoto.

L'eliminazione /etc/lightdm/unity-greeter.confe l'esecuzione sudo apt-get install --reinstall unity-greeternon creano un nuovo file di configurazione come ci si potrebbe aspettare.

Come posso ripristinare un file di configurazione mancante?

Risposte:


145
  1. Scopri quale pacchetto ha installato il file di configurazione :

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

    Come puoi vedere, il nome del pacchetto è unity-greeter.

    Se hai eliminato una directory, come /etc/pam.d, puoi elencare tutti i pacchetti aggiunti ad essa usando il percorso della directory:

    $ 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. Esegui il comando seguente, sostituendolo <package-name>con il nome del pacchetto:

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

    E per ripristinare la directory:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  3. Se tutto ha funzionato come previsto, dovresti ricevere un messaggio:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Un esempio pratico quando è necessario reinstallare tutti i file di configurazione PulseAudio:

    apt-cache pkgnames pulse |xargs -n 1 apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall 
    

3
Grazie; Mi sto chiedendo questo da anni. Dovrebbe essere davvero più facile da specificare, però - c'è un bug aperto da qualche parte per questo?
Glifo

4
Ho convertito questa risposta in un piccolo script: gist.github.com/jameshfisher/10547691
jameshfisher

5
Un ulteriore vantaggio di --force-confasksenza eliminare è che offre di mostrare la differenza tra le modifiche e l'originale.
anps,

4
Non testato con Ubuntu, ma sotto Debian per ripristinare i file di configurazione che sono gestiti da ucfl' --force-confmissopzione non funziona, è necessario utilizzare sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou,

Molto strano che quando ho usato -oho avuto un errore "dpkg: errore: opzione sconosciuta -o" ma quando ho usato --optioninvece ha funzionato. Sono su Ubuntu 16.04.1.
Ryan H.

28

Per molti casi, il file di configurazione predefinito viene fornito direttamente da un pacchetto. In tali casi, è possibile estrarre il file specifico dal pacchetto, recuperando così facilmente il file.

Per verificare se un pacchetto fornisce il file, eseguire dpkg -Sil percorso completo del file. Per esempio:

$ 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

Fornito da un pacchetto

Come possiamo vedere, /etc/ssh/sshd_confignon è fornito direttamente da nessun pacchetto, ma gli altri due sono forniti rispettivamente da openssh-cliente sudo. Quindi, se desideri ripristinare /etc/ssh/ssh_config, prima procurati il ​​pacchetto:

apt-get download openssh-client

Ora, è possibile estrarre il file direttamente nella posizione prevista o nella posizione prevista rispetto alla directory corrente anziché /, se si desidera confrontare e contrastare, oppure unirli manualmente o qualcosa del genere. Per il primo:

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

Il -C /dice tardi estrarre dopo essere cambiato in /, il che significa che il file di destinazione verrà sostituito. Se lo rimuovi, tarverrà estratto nella directory corrente, il significato ./etc/ssh/ssh_configesisterà nella directory corrente.

Se per qualche motivo sudonon funziona, utilizzare pkexecinvece. Se pkexecnon funziona neanche, riavviare in modalità di ripristino, montare /come rw. Se che non funziona ...


Creato da un pacchetto

Che dire /etc/ssh/sshd_config? Non sembra essere fornito da nessun pacchetto, quindi come è apparso?

In questo caso (e in molti altri casi simili, un altro esempio /etc/modules), il file è stato creato utilizzando uno script del manutentore del pacchetto durante l'installazione. Ciò avviene spesso quando il file di configurazione deve essere modificato a causa delle risposte degli utenti alle query. OpenSSH, ad esempio, chiede se , tra le altre cose , PermitRootLogindebba essere modificato no, nelle versioni più recenti.

Per identificare tali casi, prova a utilizzare gli script del manutentore. In genere dovresti solo guardare postinst, ma se non hai fortuna postinst, prova preinstanche:

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

In questo caso, siamo fortunati:

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

Corrisponde a un solo file e, per fortuna, contiene un codice per creare un file di configurazione predefinito :

    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

In genere, questo è ciò che vedresti (un altro esempio, /etc/modulesdakmod ):

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

Quindi, puoi cercare questo codice e ottenere direttamente il contenuto dallo script.


Nessuna sceneggiatura del genere? Puoi ancora provare a sfogliare gli elenchi di file dei pacchetti correlati per vedere se qualcosa va a buon fine, ma a questo punto non vedo alcun metodo facilmente generalizzabile (a parte la reinstallazione in ambienti transitori, come un chroot o una VM o una USB live).


A lungo termine, mantieni la tua configurazione sotto il controllo della versione. Qualsiasi VCS degno di nota può salvare la giornata qui e l' etckeeperutilità semplifica notevolmente il compito di conservare /etcun VCS.


3

Secondo questa discussione sui forum di Ubuntu, è semplice come eseguire in un terminale quanto segue:

sudo dpkg-reconfigure lightdm

1
Ho eseguito il comando e questo era l'output: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. Anche LightDM non è stato ripristinato alla sua configurazione originale.
Isaia,

@DoR: Hm ... è strano. La reinstallazione del pacchetto è un'opzione.
Nathan Osman,

L'ho reinstallato ( sudo apt-get --reinstall install lightdm) ed /etc/lightdm/unity-greeter.confè ancora vuoto.
Isaia,

1
Questo è un consiglio comune, ma è decisamente sbagliato; non funziona nella maggior parte dei casi su cui l'ho provato.
Glifo

2

Trova il pacchetto proprietario del file di configurazione:

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

produrrà qualcosa di simile a:

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

quindi il nome del pacchetto è "unity-greeter", scarica il pacchetto:

apt-get download unity-greeter

quindi estrarre i dati dell'albero dei file system in un file tar:

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

infine estrai solo quella configurazione esatta ovunque tu voglia che sia:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf è il nome del file nel nostro archivio.
  • /etc/lightdm/unity-greeter.conf è dove lo sto inviando per essere archiviato.

O come suggerito da @Muru, possiamo farlo in una sola riga:

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

1
Se lo stai semplicemente ripristinando al suo posto, fallo dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, quindi tareseguirai il cd /prima di estrarlo.
Muru,

@muru aggiunto come alternativa;)
Ravexina il

Lascia sempre un commento quando voti verso il basso ...
Ravexina,

1

Ho avuto lo stesso problema su Ubuntu 17.04. La postinstallazione utilizza un modello da /usr/share/openssh/. Verifica se il rootlogin è abilitato o meno, imposta questa opzione e la copia su /etc/ssh. Dopodiché fa alcune chiamate ucf e ucfr (non so a cosa serva).

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

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

Ora regola il tuo sshd_configcome vuoi.



-1

Elimina (indietro) il file e reinstallalo unity-greetercon apt-get install --reinstall unity-greeter.


1
Questo non ripristina i file di configurazione.
Starbeamrainbowlabs
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.