Answers:
找出安装了配置文件的软件包:
$ dpkg -S unity-greeter.conf
unity-greeter: /etc/lightdm/unity-greeter.conf
如您所见,包的名称为unity-greeter
。
如果删除了目录(如)/etc/pam.d
,则可以使用目录路径列出添加到该目录的每个软件包:
$ 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
运行以下命令,用<package-name>
软件包名称替换:
sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" <package-name>
并用于还原目录:
sudo apt install --reinstall -o Dpkg::Options::="--force-confask,confnew,confmiss" $(dpkg -S /etc/some/directory | sed 's/,//g; s/:.*//')
如果一切正常,您应该收到一条消息:
Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system.
Installing new config file as you requested.
需要重新安装所有PulseAudio配置文件的实际示例:
apt-cache pkgnames pulse |xargs -n 1 apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall
--force-confask
不删除的另一个好处是,它可以显示更改和原始更改之间的差异。
ucf
的--force-confmiss
选项,将无法正常工作,你必须使用sudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname]
。
-o
出现“ dpkg:错误:未知选项-o”错误,但是当我使用--option
它时却起作用。我在Ubuntu 16.04.1。
在许多情况下,默认配置文件是由软件包直接提供的。在这种情况下,您可以从包中提取特定文件,从而轻松地恢复该文件。
要检查软件包是否提供文件,请在文件dpkg -S
的完整路径上运行。例如:
$ 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
如我们所见,/etc/ssh/sshd_config
它不是由任何包直接提供的,而其他两个分别由openssh-client
和提供sudo
。因此,如果您希望恢复/etc/ssh/ssh_config
,请首先获取软件包:
apt-get download openssh-client
现在,您可以将文件直接提取到其预期位置,也可以将其提取到相对于当前目录的预期位置,而不是/
,如果您希望进行比较和对比,或者手动合并它们或其他内容。对于前者:
dpkg-deb --fsys-tarfile openssh-client_*.deb | sudo tar x ./etc/ssh/ssh_config -C /
该-C /
通知tar
更换后提取/
,这意味着该目标文件将被替换。如果删除它,tar
将解压缩到当前目录,这意味着./etc/ssh/ssh_config
将存在于当前目录中。
如果由于某种原因sudo
无法使用,请pkexec
改用。如果pkexec
仍然不起作用,请重新启动至恢复模式,并安装/
为rw
。如果那不起作用...
那/etc/ssh/sshd_config
呢 它似乎没有任何包装提供,那么它是怎么出现的呢?
在这种情况下(在许多其他情况下,另一个示例是/etc/modules
),该文件是在安装时使用包维护程序脚本创建的。当由于用户对查询的响应而需要更改配置文件时,通常会这样做。例如,OpenSSH询问是否PermitRootLogin
应no
在较新的版本中将其更改为。
要确定这种情况,请尝试浏览维护者脚本。通常,您只需要看一下即可postinst
,但是如果您对没什么好运postinst
,请尝试preinst
:
grep -l /etc/ssh/sshd_config /var/lib/dpkg/info/*.postinst
在这种情况下,我们很幸运:
$ grep /etc/ssh/sshd_config /var/lib/dpkg/info/*.postinst -l
/var/lib/dpkg/info/openssh-server.postinst
只匹配一个文件,而且很幸运,它包含创建默认配置文件的代码:
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
通常,这是您所看到的(另一个示例,/etc/modules
来自kmod
):
cat > /path/to/the/file <<EOF
# default contents
EOF
因此,您可以查找此代码并直接从脚本中获取内容。
没有这样的脚本?您仍然可以尝试浏览相关软件包的文件列表以查看是否有任何问题,但是在这一点上,我看不到任何易于推广的方法(缺少在chroot或VM或实时USB等瞬态环境中的重新安装)。
从长远来看,将您的配置置于版本控制之下。任何价值不菲的VCS都可以在这里节省一天,而且该etckeeper
实用程序大大简化了保存/etc
VCS 的任务。
根据Ubuntu论坛上的该线程,它就像在终端中运行以下命令一样简单:
sudo dpkg-reconfigure lightdm
dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing
。LightDM也没有还原为其原始配置。
sudo apt-get --reinstall install lightdm
),但仍然/etc/lightdm/unity-greeter.conf
为空。
查找拥有配置文件的软件包:
dpkg --search /etc/path/to/config
它将输出类似于:
unity-greeter: /etc/lightdm/unity-greeter.conf
因此,程序包名称为“ unity-greeter”,请下载程序包:
apt-get download unity-greeter
然后将其文件系统树数据提取到tar文件中:
dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb > pkg.tar
最终仅在您希望的任何位置提取该确切配置:
tar -Oxf pkg.tar ./etc/lightdm/unity-greeter.conf |
sudo tee /etc/lightdm/unity-greeter.conf
./etc/lightdm/unity-greeter.conf
是存档中的文件名。/etc/lightdm/unity-greeter.conf
是我将其发送到存储的地方。或者按照@Muru的建议,我们可以在一班轮上完成:
dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb |
sudo tar -x -C / ./etc/lightdm/unity-greeter.conf
dpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf
,在提取之前tar
cd也会如此/
。
这不适用于所有配置文件。对于/etc/nsswitch.conf
,请参阅如何还原/重新创建etc / nsswitch.conf文件。用似乎无法重建该文件dpkg-reconfigure
。
删除(回)的文件,并重新安装unity-greeter
使用apt-get install --reinstall unity-greeter
。