Làm cách nào để khôi phục tập tin cấu hình?


98

Tôi muốn khôi phục LightDM về trạng thái mặc định, vì một số lý do
/etc/lightdm/unity-greeter.confbây giờ là một tệp trống.

Xóa /etc/lightdm/unity-greeter.confvà sau đó chạy sudo apt-get install --reinstall unity-greeterkhông tạo tệp cấu hình mới như bạn mong đợi.

Làm thế nào tôi có thể khôi phục một tập tin cấu hình bị thiếu?

Câu trả lời:


144
  1. Tìm hiểu gói nào đã cài đặt tệp cấu hình :

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

    Như bạn có thể thấy, tên của gói là unity-greeter.

    Nếu bạn đã xóa một thư mục, như /etc/pam.d, bạn có thể liệt kê mọi gói được thêm vào nó bằng cách sử dụng đường dẫn thư mục:

    $ 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. Chạy lệnh sau, thay thế <package-name>bằng tên của gói:

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

    Và để khôi phục thư mục:

    sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
    
  3. Nếu mọi thứ hoạt động như mong đợi, bạn sẽ nhận được một tin nhắn:

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. Một ví dụ thực tế khi cần cài đặt lại tất cả các tệp cấu hình PulseAudio:

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

3
Cảm ơn bạn; Tôi đã tự hỏi về điều này trong nhiều năm. Nó thực sự nên dễ dàng hơn để xác định, mặc dù - có một lỗi mở ở đâu đó cho điều đó?
Glyph

4
Tôi đã chuyển đổi câu trả lời này thành một tập lệnh nhỏ: gist.github.com/jameshfisher/10547691
jameshfisher

5
Một lợi ích nữa của việc --force-confaskkhông xóa là nó cung cấp để hiển thị sự khác biệt giữa các thay đổi của bạn và bản gốc.
anps

4
Không thử nghiệm với Ubuntu, nhưng dưới Debian để khôi phục tập tin cấu hình mà được quản lý bởi ucfcác --force-confmisstùy chọn sẽ không làm việc, bạn phải sử dụng sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname].
Skippy le Grand Gourou

Rất kỳ lạ là khi tôi sử dụng, -otôi gặp lỗi "dpkg: error: unknown tùy chọn -o" nhưng khi tôi sử dụng --optionthay thế thì nó hoạt động. Tôi đang dùng Ubuntu 16.04.1.
Ryan H.

27

Đối với nhiều trường hợp, tệp cấu hình mặc định được cung cấp trực tiếp bởi một gói. Trong các trường hợp như vậy, bạn có thể trích xuất tệp cụ thể từ gói, do đó dễ dàng khôi phục tệp.

Để kiểm tra xem một gói có cung cấp tệp không, hãy chạy dpkg -Strên đường dẫn đầy đủ của tệp. Ví dụ:

$ 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

Được cung cấp bởi một gói

Như chúng ta có thể thấy, /etc/ssh/sshd_configkhông được cung cấp trực tiếp bởi bất kỳ gói nào, nhưng hai gói còn lại được cung cấp bởi openssh-clientsudotương ứng. Vì vậy, nếu bạn muốn khôi phục /etc/ssh/ssh_config, trước tiên hãy lấy gói:

apt-get download openssh-client

Bây giờ, bạn có thể trích xuất tệp trực tiếp đến vị trí dự định của nó hoặc đến vị trí dự định của nó so với thư mục hiện tại thay vì /, nếu bạn muốn so sánh và đối chiếu, hoặc hợp nhất thủ công chúng hoặc một cái gì đó. Cho ngươi tiên nhiệm:

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

Các -C /kể tarđể giải nén sau khi chuyển sang /, có nghĩa là các tập tin mục tiêu sẽ được thay thế. Nếu bạn loại bỏ nó, tarsẽ trích xuất vào thư mục hiện tại, nghĩa là ./etc/ssh/ssh_configsẽ tồn tại trong thư mục hiện tại của bạn.

Nếu vì lý do sudonào đó không hoạt động, pkexecthay vào đó sử dụng . Nếu pkexeckhông hoạt động, khởi động lại vào chế độ phục hồi, gắn kết /như rw. Nếu đó không hoạt động ...


Tạo bởi một gói

Thế còn /etc/ssh/sshd_config? Nó dường như không được cung cấp bởi bất kỳ gói nào, vậy nó đã xuất hiện như thế nào?

Trong trường hợp này (và trong nhiều trường hợp khác, ví dụ khác /etc/modules), tệp được tạo bằng tập lệnh duy trì gói trong khi cài đặt. Điều này thường được thực hiện khi tệp cấu hình cần được thay đổi do phản hồi của người dùng đối với các truy vấn. OpenSSH, ví dụ, hỏi liệu có PermitRootLoginnên thay đổi thành no, trong các phiên bản mới hơn, trong số những thứ khác.

Để xác định các trường hợp như vậy, hãy thử greping thông qua các tập lệnh duy trì. Thông thường bạn sẽ chỉ cần nhìn postinst, nhưng nếu bạn không có may mắn nào postinst, hãy thử preinst:

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

Trong trường hợp này, chúng tôi gặp may mắn:

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

Chỉ có một tệp phù hợp và may mắn sẽ có nó, nó chứa mã để tạo tệp cấu hình mặc định :

    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

Thông thường, đây là những gì bạn sẽ thấy (ví dụ khác, /etc/modulestừkmod ):

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

Vì vậy, bạn có thể tìm mã này và lấy nội dung từ tập lệnh trực tiếp.


Không có kịch bản như vậy? Bạn vẫn có thể thử chọc vào các filelist của các gói liên quan để xem có gì xảy ra không, nhưng tại thời điểm này, tôi thấy không có phương pháp dễ khái quát nào (thiếu cài đặt lại trên các môi trường nhất thời, như chroot hoặc VM hoặc USB trực tiếp).


Về lâu dài, hãy giữ cấu hình của bạn dưới sự kiểm soát phiên bản. Bất kỳ VCS trị giá muối của nó có thể tiết kiệm trong ngày ở đây, và các etckeepertiện ích đơn giản hoá đáng kể nhiệm vụ giữ /etctrong một VCS.


3

Theo chủ đề này trên Diễn đàn Ubuntu, nó đơn giản như việc chạy các phần sau trong một thiết bị đầu cuối:

sudo dpkg-reconfigure lightdm

1
Tôi đã chạy lệnh đó và đây là đầu ra : dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing. LightDM cũng không được khôi phục về cấu hình ban đầu.
Ê-sai

@DoR: Hừm ... thật lạ. Là cài đặt lại gói một tùy chọn.
Nathan Osman

Tôi đã cài đặt lại nó ( sudo apt-get --reinstall install lightdm) và vẫn còn /etc/lightdm/unity-greeter.conftrống.
Ê-sai

1
Đây là lời khuyên phổ biến, nhưng nó chắc chắn là sai; nó không hoạt động đối với hầu hết các trường hợp tôi đã thử nó.
Glyph

2

Tìm gói sở hữu tệp cấu hình:

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

nó sẽ xuất ra một cái gì đó tương tự như:

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

vì vậy tên gói là "unity-helloer", tải xuống gói:

apt-get download unity-greeter

sau đó trích xuất dữ liệu cây hệ thống tệp của nó thành một tệp tar:

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

cuối cùng chỉ trích xuất cấu hình chính xác đó bất cứ nơi nào bạn muốn:

tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf 
  • ./etc/lightdm/unity-greeter.conf là tên tập tin trong kho lưu trữ của chúng tôi.
  • /etc/lightdm/unity-greeter.conf là nơi tôi đang gửi nó sẽ được lưu trữ.

Hoặc như @Muru đề xuất, chúng tôi có thể làm điều đó trong một lớp lót:

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

1
Nếu bạn chỉ đơn giản là khôi phục nó trở lại nơi nó thuộc về, hãy làm dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf, do đó, tarcd sẽ /trước khi giải nén.
muru

@muru được thêm vào thay thế;)
Ravexina

Luôn để lại bình luận khi bỏ phiếu ...
Ravexina

1

Tôi đã có cùng một vấn đề trên Ubuntu 17.04. Các cài đặt bài sử dụng một mẫu từ /usr/share/openssh/. Nó kiểm tra xem rootlogin có được bật hay không, đặt tùy chọn này và sao chép nó vào /etc/ssh. Sau đó, nó thực hiện một số cuộc gọi ucf và ucfr (tôi không biết đó là để làm gì).

Chỉ cần sao chép /usr/share/openssh/sshd_configvào /etc/ssh/sshd_config:

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

Bây giờ điều chỉnh của bạn sshd_confignhư bạn muốn.



-1

Xóa (trở lại) các tập tin và và cài đặt lại unity-greetervới apt-get install --reinstall unity-greeter.


1
Điều này không khôi phục các tập tin cấu hình.
starbeamrainbowlabs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.