Wie kann ich Konfigurationsdateien wiederherstellen?

98

Ich möchte LightDM auf den Standardzustand zurücksetzen, da es aus irgendeinem Grund
/etc/lightdm/unity-greeter.confjetzt eine leere Datei ist.

Durch das Löschen /etc/lightdm/unity-greeter.confund anschließende Ausführen sudo apt-get install --reinstall unity-greeterwird nicht wie erwartet eine neue Konfigurationsdatei erstellt.

Wie kann ich eine fehlende Konfigurationsdatei wiederherstellen?

Jesaja
quelle

Antworten:

144
  1. Finden Sie heraus, in welchem ​​Paket die Konfigurationsdatei installiert ist :

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

    Wie Sie sehen, lautet der Name des Pakets unity-greeter.

    Wenn Sie beispielsweise ein Verzeichnis gelöscht haben, /etc/pam.dkönnen Sie jedes hinzugefügte Paket mithilfe des Verzeichnispfads auflisten:

    $ 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. Führen Sie den folgenden Befehl aus und ersetzen Sie ihn <package-name>durch den Namen des Pakets:

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

    Und zum Wiederherstellen des Verzeichnisses:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  3. Wenn alles wie erwartet funktioniert hat, sollten Sie eine Nachricht erhalten:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Ein praktisches Beispiel für die Neuinstallation aller PulseAudio-Konfigurationsdateien:

    apt-cache pkgnames pulse |xargs -n 1 apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall 
    
Jesaja
quelle
3
Danke; Darüber habe ich mich seit Jahren gewundert. Es sollte aber wirklich einfacher zu spezifizieren sein - ist dafür irgendwo ein Fehler offen?
Glyphe
4
Ich habe diese Antwort in ein kleines Skript umgewandelt: gist.github.com/jameshfisher/10547691
jameshfisher
5
Ein zusätzlicher Vorteil von --force-confaskohne zu löschen ist, dass es den Unterschied zwischen Ihren Änderungen und dem Original zeigt.
Am
4
Nicht mit Ubuntu getestet, aber unter Debian zum Wiederherstellen von Konfigurationsdateien, die von ucfder --force-confmissOption verwaltet werden, nicht funktionieren, müssen Sie verwenden sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou
Sehr seltsam, dass ich bei der Verwendung die -oFehlermeldung "dpkg: error: unknown option -o" erhalten habe, aber bei der Verwendung hat --optiones funktioniert. Ich bin auf Ubuntu 16.04.1.
Ryan H.
27

In vielen Fällen wird die Standardkonfigurationsdatei direkt von einem Paket bereitgestellt. In solchen Fällen können Sie die spezifische Datei aus dem Paket extrahieren und so die Datei leicht wiederherstellen.

Um zu überprüfen, ob ein Paket die Datei enthält, führen Sie dpkg -Sden vollständigen Pfad der Datei aus. Zum Beispiel:

$ 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

Bereitgestellt von einem Paket

Wie wir sehen können, /etc/ssh/sshd_configwird nicht direkt von jedem Paket zur Verfügung gestellt, aber die anderen beiden durch vorgesehen sind openssh-clientund sudojeweils. Wenn Sie sich also erholen möchten /etc/ssh/ssh_config, holen Sie sich zuerst das Paket:

apt-get download openssh-client

Jetzt können Sie die Datei entweder direkt an den vorgesehenen Speicherort extrahieren oder relativ zum aktuellen Verzeichnis an den vorgesehenen Speicherort, anstatt sie /zu vergleichen und zu vergleichen oder manuell zusammenzuführen. Für das ehemalige:

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

Der -C /Befehl tarzum Extrahieren nach dem Wechsel zu /, was bedeutet, dass die Zieldatei ersetzt wird. Wenn Sie es entfernen, tarwird es in das aktuelle Verzeichnis extrahiert, was bedeutet, ./etc/ssh/ssh_configdass es in Ihrem aktuellen Verzeichnis vorhanden ist.

Wenn aus irgendeinem Grund sudonicht funktioniert, verwenden Sie pkexecstattdessen. Wenn pkexecdies auch nicht funktioniert, starten Sie den Computer im Wiederherstellungsmodus neu und hängen Sie ihn /als ein rw. Wenn das nicht geht ...


Erstellt von einem Paket

Was ist /etc/ssh/sshd_config? Es scheint von keinem Paket bereitgestellt zu werden. Wie ist es also erschienen?

In diesem Fall (und in vielen anderen Fällen, in denen es sich um ein anderes Beispiel handelt /etc/modules) wurde die Datei während der Installation mit einem Paketverwaltungsskript erstellt . Dies geschieht häufig, wenn die Konfigurationsdatei aufgrund von Benutzerantworten auf Abfragen geändert werden muss. OpenSSH fragt beispielsweise, ob unter anderem in neueren Versionen PermitRootLogingeändert werden soll no.

Um solche Fälle zu identifizieren, versuchen Sie, die Betreuerskripte zu durchsuchen. Normalerweise müsstest du nur schauen postinst, aber wenn du kein Glück hast postinst, versuche es preinstauch:

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

In diesem Fall haben wir Glück:

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

Es stimmt nur eine Datei überein, und zum Glück enthält sie Code zum Erstellen einer Standardkonfigurationsdatei :

    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 der Regel sehen Sie Folgendes (ein weiteres Beispiel /etc/modulesauskmod ):

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

Sie können also nach diesem Code suchen und den Inhalt direkt aus dem Skript abrufen.


Kein solches Skript? Sie können immer noch versuchen, in den Dateilisten verwandter Pakete zu stöbern, um festzustellen, ob etwas zutrifft. Derzeit sehe ich jedoch keine einfach zu verallgemeinernde Methode (kurz vor der Neuinstallation in vorübergehenden Umgebungen wie einer Chroot oder einer VM oder einem Live-USB).


Behalten Sie auf lange Sicht Ihre Konfiguration unter Versionskontrolle. Jedes VCS, das sein Geld wert ist, kann hier den Tag retten, und das etckeeperHilfsprogramm vereinfacht die Aufbewahrung /etcin einem VCS erheblich .

muru
quelle
3

Laut diesem Thread in den Ubuntu-Foren ist es so einfach, in einem Terminal Folgendes auszuführen:

sudo dpkg-reconfigure lightdm
Nathan Osman
quelle
1
Ich lief den Befehl und das war die Ausgabe: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. LightDM wurde auch nicht in seiner ursprünglichen Konfiguration wiederhergestellt.
Jesaja,
@DoR: Hm ... das ist seltsam. Ist die Neuinstallation des Pakets eine Option?
Nathan Osman
Ich habe es neu installiert ( sudo apt-get --reinstall install lightdm) und ist immer noch /etc/lightdm/unity-greeter.confleer.
Jesaja,
1
Dies ist ein allgemeiner Rat, der aber definitiv falsch ist. In den meisten Fällen funktioniert es nicht. Ich habe es anprobiert.
Glyphe
2

Suchen Sie das Paket, dem die Konfigurationsdatei gehört:

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

es wird etwas Ähnliches ausgeben wie:

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

Damit der Paketname "unity-greeter" lautet, laden Sie das Paket herunter:

apt-get download unity-greeter

Extrahieren Sie dann die Daten des Dateisystembaums in eine TAR-Datei:

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

Extrahieren Sie schließlich nur die genaue Konfiguration, die Sie möchten:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf ist der Dateiname in unserem Archiv.
  • /etc/lightdm/unity-greeter.conf Hier schicke ich es zur Aufbewahrung.

Oder wie @Muru vorgeschlagen hat, können wir es in einem Liner tun:

dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb |
sudo tar -x -C / ./etc/lightdm/unity-greeter.conf
Ravexina
quelle
1
Wenn Sie die Wiederherstellung es einfach zurück , wo es hingehört, zu tun dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, so tarwird cd /vor extrahieren.
muru
@muru als Alternative hinzugefügt;)
Ravexina
Hinterlasse immer einen Kommentar, wenn
Du abstimmst
1

Ich hatte das gleiche Problem auf Ubuntu 17.04. Die Nachinstallation verwendet eine Vorlage von /usr/share/openssh/. Es prüft, ob rootlogin aktiviert ist oder nicht, setzt diese Option und kopiert sie nach /etc/ssh. Danach führt es einige UFC- und UFC-Aufrufe durch (ich weiß nicht, wofür das ist).

Einfach kopieren /usr/share/openssh/sshd_confignach /etc/ssh/sshd_config:

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

Stellen Sie nun Ihren ein, sshd_configwie Sie möchten.

user2162968
quelle
0

Dies funktioniert nicht bei allen Konfigurationsdateien. Für /etc/nsswitch.confsehen, wie wiederherstellen / neu etc / nsswitch.conf Dateien . Es scheint nicht möglich zu sein, diese Datei mit zu rekonstruieren dpkg-reconfigure.

Bram Geron
quelle
Ich weiß, dass es sich bei der ursprünglichen Frage um LightDM handelte, aber anscheinend haben die Administratoren entschieden, dass es sich bei dieser Frage um alle Konfigurationsdateien handelt
Bram Geron,
-1

Löschen (zurück) auf die Datei und neu zu installieren und unity-greetermit apt-get install --reinstall unity-greeter.

RolandiXor
quelle
1
Dadurch werden die Konfigurationsdateien nicht wiederhergestellt.
Starbeamrainbowlabs