Jak mogę przywrócić pliki konfiguracyjne?


98

Chciałbym przywrócić LightDM do stanu domyślnego, ponieważ z jakiegoś powodu
/etc/lightdm/unity-greeter.confjest on teraz pustym plikiem.

Usunięcie, /etc/lightdm/unity-greeter.confa następnie uruchomienie sudo apt-get install --reinstall unity-greeternie tworzy nowego pliku konfiguracyjnego, jak można się spodziewać.

Jak mogę przywrócić brakujący plik konfiguracyjny?

Odpowiedzi:


144
  1. Sprawdź, który pakiet zainstalował plik konfiguracyjny :

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

    Jak widać, nazwa pakietu to unity-greeter.

    Jeśli usunąłeś katalog, na przykład /etc/pam.d, możesz wyświetlić listę wszystkich dodanych do niego pakietów, używając ścieżki do katalogu:

    $ 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. Uruchom następujące polecenie, zastępując <package-name>nazwę pakietu:

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

    Aby przywrócić katalog:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  3. Jeśli wszystko działało zgodnie z oczekiwaniami, powinieneś otrzymać komunikat:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Praktyczny przykład, gdy trzeba ponownie zainstalować wszystkie pliki konfiguracyjne PulseAudio:

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

3
Dziękuję Ci; Zastanawiam się nad tym od lat. Jednak naprawdę powinno to być łatwiejsze do określenia - czy jest gdzieś otwarty błąd?
Glyph,

4
Przekształciłem tę odpowiedź na mały skrypt: gist.github.com/jameshfisher/10547691
jameshfisher

5
Dodatkową korzyścią --force-confaskbez usuwania jest to, że oferuje różnicę między zmianami a oryginałem.
anps

4
Nie testowano z Ubuntu, ale w Debianie, aby przywrócić pliki konfiguracyjne, które są zarządzane przez ucftej --force-confmissopcji nie będzie działać, trzeba użyć sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou

Bardzo dziwne, że kiedy użyłem -o, dostałem błąd „dpkg: error: unknown option -o”, ale kiedy go użyłem --option, zadziałało. Jestem na Ubuntu 16.04.1.
Ryan H.

27

W wielu przypadkach domyślny plik konfiguracyjny jest dostarczany bezpośrednio przez pakiet. W takich przypadkach możesz wyodrębnić konkretny plik z pakietu, dzięki czemu łatwo odzyskasz plik.

Aby sprawdzić, czy pakiet zawiera plik, uruchom dpkg -Spełną ścieżkę do pliku. Na przykład:

$ 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

Dostarczone przez pakiet

Jak widzimy, /etc/ssh/sshd_confignie jest dostarczany bezpośrednio przez żaden pakiet, ale pozostałe dwa są dostarczane odpowiednio przez openssh-clienti sudo. Więc jeśli chcesz odzyskać /etc/ssh/ssh_config, najpierw zdobądź pakiet:

apt-get download openssh-client

Teraz możesz wyodrębnić plik bezpośrednio do jego zamierzonej lokalizacji lub do zamierzonej lokalizacji względem bieżącego katalogu zamiast /, jeśli chcesz porównać i kontrastować, lub ręcznie scalić je lub coś. Dla tych pierwszych:

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

-C /Mówi tarwyodrębnić po zmianie /, co oznacza, że plik docelowy zostaną zastąpione. Jeśli go usuniesz, tarwyodrębnisz go do bieżącego katalogu, co oznacza, że ./etc/ssh/ssh_configbędzie istniał w twoim bieżącym katalogu.

Jeśli z jakiegoś powodu sudonie działa, użyj pkexeczamiast tego. Jeśli pkexecteż nie działa, uruchom ponownie w trybie odzyskiwania, zamontuj /jako rw. Jeśli to nie działa ...


Utworzony przez pakiet

Co /etc/ssh/sshd_config? Wydaje się, że nie zapewnia go żaden pakiet, więc jak to wyglądało?

W tym przypadku (i w wielu innych takich przypadkach, innym przykładem /etc/modules), plik został utworzony przy użyciu skryptu opiekuna pakietu podczas instalacji. Często dzieje się tak, gdy plik konfiguracyjny wymaga zmiany ze względu na odpowiedzi użytkowników na zapytania. Na przykład OpenSSH pyta, czy PermitRootLoginnależy go zmienić nomiędzy innymi w nowszych wersjach.

Aby zidentyfikować takie przypadki, spróbuj przejrzeć skrypty opiekuna. Zazwyczaj wystarczy spojrzeć postinst, ale jeśli nie masz szczęścia postinst, spróbuj preinstrównież:

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

W tym przypadku mamy szczęście:

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

Tylko jeden plik pasował i, na szczęście, zawiera kod do utworzenia domyślnego pliku konfiguracyjnego :

    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

Zazwyczaj jest to, co zobaczysz (inny przykład, /etc/moduleszkmod ):

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

Możesz więc poszukać tego kodu i pobrać zawartość bezpośrednio ze skryptu.


Nie ma takiego skryptu? Nadal możesz próbować przeszukiwać listy plików powiązanych pakietów, aby sprawdzić, czy coś nie trafi, ale w tym momencie nie widzę łatwej do uogólnienia metody (brak ponownej instalacji w środowiskach przejściowych, takich jak chroot lub VM lub USB na żywo).


Na dłuższą metę zachowaj swoją konfigurację pod kontrolą wersji. Wszelkie VCS wart jego sól można zapisać dzień tutaj i narzędzie znacznie upraszcza utrzymanie w VCS.etckeeper/etc


3

Zgodnie z tym wątkiem na forach Ubuntu jest to tak proste, jak uruchomienie następującego w terminalu:

sudo dpkg-reconfigure lightdm

1
Pobiegłem tego polecenia i to było wyjście: dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. LightDM również nie został przywrócony do oryginalnej konfiguracji.
Izajasza

@DoR: Hm ... to dziwne. Ponowna instalacja pakietu jest opcją.
Nathan Osman

Przeinstalowałem go ( sudo apt-get --reinstall install lightdm) i nadal /etc/lightdm/unity-greeter.confjest pusty.
Izajasza

1
Jest to powszechna rada, ale jest zdecydowanie błędna; nie działa w większości przypadków, w których go wypróbowałem.
Glyph,

2

Znajdź pakiet, który jest właścicielem pliku konfiguracyjnego:

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

wyświetli coś podobnego do:

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

więc nazwa pakietu to „unity-greeter”, pobierz pakiet:

apt-get download unity-greeter

następnie wyodrębnij dane drzewa systemu plików do pliku tar:

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

wreszcie wyodrębnij tylko tę dokładną konfigurację, gdziekolwiek chcesz:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf to nazwa pliku w naszym archiwum.
  • /etc/lightdm/unity-greeter.conf wysyłam go do przechowywania.

Lub, jak sugeruje @Muru, możemy to zrobić w jednym wierszu:

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

1
Jeśli po prostu przywracasz go tam, gdzie jest jego miejsce, zrób to dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, a tarnastępnie wypakuj go /przed wypakowaniem.
muru

@muru dodano jako alternatywę;)
Ravexina,

Zawsze zostawiaj komentarz podczas głosowania w dół ...
Ravexina,

1

Miałem ten sam problem na Ubuntu 17.04. Poinstalacja używa szablonu z /usr/share/openssh/. Sprawdza, czy rootlogin jest włączony, czy nie, ustawia tę opcję i kopiuje ją /etc/ssh. Potem wykonuje kilka wywołań ucf i ucfr (nie wiem po co to jest).

Po prostu skopiuj /usr/share/openssh/sshd_configdo /etc/ssh/sshd_config:

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

Teraz dostosuj, sshd_configjak chcesz.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.