Vraag Hoe kan ik configuratiebestanden herstellen?


Ik wil LightDM naar de standaardstatus herstellen, omdat om een ​​of andere reden
/etc/lightdm/unity-greeter.conf is nu een leeg bestand.

wissen /etc/lightdm/unity-greeter.conf en dan rennen sudo apt-get install --reinstall unity-greeter maakt geen nieuw configuratiebestand zoals je zou verwachten.

Hoe kan ik een ontbrekend configuratiebestand herstellen?


85
2017-10-14 23:42


oorsprong




antwoorden:


  1. Er achter komen welk pakket installeerde het configuratiebestand:

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

    Zoals u kunt zien, is de naam van het pakket unity-greeter.

    Als je een map hebt verwijderd, zoals /etc/pam.d, u kunt elk pakket dat hieraan is toegevoegd weergeven met behulp van het directorypad:

    $ 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. Hernoem (of verwijder) het configuratiebestand dat u wilt herstellen:

    sudo mv -i /etc/lightdm/unity-greeter.conf /etc/lightdm/unity-greeter.conf.bak 
    
  3. Voer de volgende opdracht uit en vervang deze <package-name> met de naam van het pakket:

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

    En voor het herstellen van de directory:

    sudo apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  4. Als alles werkte zoals verwacht, zou u dit bericht moeten krijgen:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  5. Een praktisch voorbeeld bij het opnieuw installeren van alle PulseAudio-configuratiebestanden:

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

123
2017-10-15 18:43



Dank je; Ik heb me hier al jaren over afgevraagd. Het zou eigenlijk eenvoudiger moeten zijn om te specificeren - is daar ergens een bug voor geopend? - Glyph
Met --force-confask zou u stap 2 kunnen verwijderen. - bukzor
Ik heb dit antwoord omgezet naar een klein script: gist.github.com/jameshfisher/10547691 - jameshfisher
Een extra voordeel van --force-confask zonder te verwijderen is dat het biedt om het verschil tussen uw wijzigingen en het origineel te tonen. - anps
Niet getest met Ubuntu, maar onder Debian om configuratiebestanden te herstellen die worden beheerd door ucf de --force-confmiss optie zal niet werken, je moet gebruiken sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname]. - Skippy le Grand Gourou


In veel gevallen wordt het standaardconfiguratiebestand direct door een pakket geleverd. In dergelijke gevallen kunt u het specifieke bestand uit het pakket extraheren, waardoor u het bestand gemakkelijk kunt herstellen.

Voer uit om te controleren of een pakket het bestand levert dpkg -S op het volledige pad van het bestand. Bijvoorbeeld:

$ 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

Geleverd door een pakket

Zoals we kunnen zien, /etc/ssh/sshd_config wordt niet rechtstreeks aangeboden door een pakket, maar de andere twee worden geleverd door openssh-client en sudo respectievelijk. Dus als u wilt herstellen /etc/ssh/ssh_config, krijg eerst het pakket:

apt-get download openssh-client

Nu kunt u het bestand rechtstreeks naar de bedoelde locatie of naar de beoogde locatie uitpakken familielid naar de huidige map in plaats van /, als u wilt vergelijken en contrasteren, of handmatig wilt samenvoegen of zoiets. Voor de eerste:

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

De -C / vertelt tar uitpakken na het veranderen naar /, wat betekent dat het doelbestand zal worden vervangen. Als je het verwijdert, tar zal uitpakken naar de huidige map, wat betekent ./etc/ssh/ssh_config zal bestaan ​​in uw huidige map.

Als om een ​​of andere reden sudo werkt niet, gebruiken pkexec in plaats daarvan. Als pkexec werkt ook niet, herstart naar herstelmodus, mount / als rw. Als dat werkt niet ...


Gemaakt door een pakket

Hoe zit het met /etc/ssh/sshd_config? Het lijkt niet te worden geleverd door een pakket, dus hoe lijkt het?

In dit geval (en in veel andere dergelijke gevallen is een ander voorbeeld dat /etc/modules), is het bestand gemaakt met een pakketonderhoudscript tijdens de installatie. Dit wordt vaak gedaan wanneer het configuratiebestand moet worden gewijzigd vanwege reacties van gebruikers op query's. OpenSSH vraagt ​​bijvoorbeeld of PermitRootLogin moet worden gewijzigd in no, in nieuwere versies, onder andere dingen.

Als u dergelijke gevallen wilt identificeren, probeert u de onderhoudsscripts door te bladeren. Meestal hoeft u alleen maar te kijken postinst, maar als je geen geluk hebt postinst, proberen preinst ook:

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

In dit geval hebben we geluk:

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

Er is maar één bestand gekoppeld en als het toeval wil, bevat het code om een ​​te maken standaard configuratiebestand:

    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

Meestal is dit wat u zou zien (nog een voorbeeld, /etc/modules van kmod):

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

U kunt dus naar deze code zoeken en de inhoud rechtstreeks uit het script halen.


Geen script? Je kunt nog steeds proberen door de filelisten van gerelateerde pakketten te porren om te zien of er iets toeslaat, maar op dit moment zie ik geen eenvoudig te generaliseren methode (in plaats van herinstallatie op tijdelijke omgevingen, zoals een chroot of een VM of een live USB).


Houd op de lange termijn uw configuratie onder versiebeheer. Elke VCS die zijn zout waard is, kan de dag hier redden, en de etckeeper nut aanzienlijk vereenvoudigt de taak van het houden /etc in een VCS.


20
2018-05-22 14:31





Volgens deze thread op de Ubuntu Forums, het is net zo eenvoudig als het volgende in een terminal uitvoeren:

sudo dpkg-reconfigure lightdm

3
2017-10-14 23:45



Ik heb die opdracht uitgevoerd en dit was de uitvoer: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. LightDM is ook niet in de oorspronkelijke configuratie hersteld. - Isaiah
@DoR: Hm ... dat is raar. Is het opnieuw installeren van het pakket een optie. - Nathan Osman
Ik heb het opnieuw geïnstalleerd (sudo apt-get --reinstall install lightdm) en toch /etc/lightdm/unity-greeter.conf is leeg. - Isaiah
Dit is een algemeen advies, maar het is absoluut verkeerd; het werkt niet voor de meeste gevallen waar ik het heb geprobeerd. - Glyph


Zoek het pakket met het configuratiebestand:

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

het zal iets opleveren dat lijkt op:

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

dus de pakketnaam is "unity-greeter", download het pakket:

apt-get download unity-greeter

haal dan de boomstructuur van het bestandssysteem naar een tar-bestand:

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

eindelijk alleen die exacte configuratie uitpakken waar je maar wilt:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf is de bestandsnaam in ons archief.
  • /etc/lightdm/unity-greeter.conf is waar ik het naar toe stuur om te worden opgeslagen.

Of zoals @Muru suggereerde, we kunnen het in één lijn doen:

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

2
2017-08-06 20:56



Als je het gewoon terugzet naar waar het thuishoort, doe het dan dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, dus tar zal cd naar / voor het extraheren. - muru
@muru toegevoegd als alternatief;) - Ravexina


Ik had hetzelfde probleem op Ubuntu 17.04. De postinstall gebruikt een sjabloon van /usr/share/openssh/. Het controleert of rootlogin is ingeschakeld of niet, stelt deze optie in en kopieert het naar /etc/ssh. Daarna doet het wat ucf en ucfr oproepen (ik weet niet waar dat voor is).

Kopieer gewoon /usr/share/openssh/sshd_config naar /etc/ssh/sshd_config:

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

Pas nu uw aan sshd_config zoals je wilt.


1
2017-07-27 12:49





Dit werkt niet alle configuratiebestanden. Voor /etc/nsswitch.conf, zien Hoe etc / nsswitch.conf bestanden te herstellen / recreëren . Het lijkt niet mogelijk om dat bestand te reconstrueren met dpkg-reconfigure.


0
2017-11-01 16:35



Ik weet dat de oorspronkelijke vraag over lightdm ging, maar blijkbaar de admins heb besloten dat deze vraag over alle configuratiebestanden gaat - Bram Geron


Verwijder (terug) het bestand en installeer het opnieuw unity-greeter met apt-get install --reinstall unity-greeter.


-1
2017-10-15 03:54



Hierdoor worden de configuratiebestanden niet hersteld. - starbeamrainbowlabs