構成ファイルを復元するにはどうすればよいですか?


98

何らかの理由
/etc/lightdm/unity-greeter.confで空のファイルになったため、LightDMをデフォルトの状態に復元したいと思います。

削除/etc/lightdm/unity-greeter.confしてから実行sudo apt-get install --reinstall unity-greeterしても、予想どおりに新しい構成ファイルは作成されません。

不足している設定ファイルを復元するにはどうすればよいですか?

回答:


144
  1. 設定ファイルをインストールたパッケージを確認します

    $ 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
    
  2. <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/:.*//')
    
  3. すべてが期待どおりに機能した場合、メッセージが表示されます。

    Configuration file `/etc/lightdm/unity-greeter.conf', does not exist on system. 
    Installing new config file as you requested.
    
  4. すべてのPulseAudio構成ファイルを再インストールする必要がある場合の実用的な例:

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

3
ありがとうございました; 私はこれについて何年も疑問に思っていました。指定するのは本当に簡単なはずですが、そのためにどこかにバグがありますか?
グリフ

4
この回答を小さなスクリプトに変換しました:gist.github.com/jameshfisher/10547691
jameshfisher

5
--force-confask削除せずに追加の利点は、変更と元の変更の差分を表示できることです。
anps 14年

4
Ubuntuではテストされていませんが、ucfこの--force-confmissオプションで管理されている設定ファイルを復元するDebianでは動作しませんsudo UCF_FORCE_CONFFMISS=1 apt-get --reinstall install [pkgname]。使用する必要があります。
スキッピールグラングロウ

使用したときに-o「dpkg:error:unknown option -o」エラーが表示されましたが、--option代わりに使用するとうまくいきました。Ubuntu 16.04.1。を使用しています。
ライアンH.

27

多くの場合、デフォルトの構成ファイルはパッケージによって直接提供されます。そのような場合は、パッケージから特定のファイルを抽出して、ファイルを簡単に復元できます。

パッケージがファイルを提供しているかどうかを確認するには、ファイルの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直接、任意のパッケージで提供されていませんが、他の2つはによって提供されているopenssh-clientsudo、それぞれ。そのため/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

一致するファイルは1つだけで、運がよければ、デフォルトの構成ファイルを作成するコードが含まれています

    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であれば、ここで1日を節約できetckeeperユーティリティ/etcはVCS を維持するタスクを大幅に簡素化します。


3

Ubuntuフォーラムのこのスレッドによると、ターミナルで次を実行するのと同じくらい簡単です。

sudo dpkg-reconfigure lightdm

1
私はそのコマンドを実行し、これは出力でした:dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_NAME missing dpkg-maintscript-helper: warning: environment variable DPKG_MAINTSCRIPT_PACKAGE missing。LightDMも元の構成に復元されませんでした。
イザヤ

@DoR:うーん...それは奇妙です。パッケージの再インストールはオプションです。
ネイサンオスマン

再インストールしましたが(sudo apt-get --reinstall install lightdm)、まだ/etc/lightdm/unity-greeter.conf空です。
イザヤ

1
これは一般的なアドバイスですが、間違いです。私が試してみたほとんどの場合は機能しません。
グリフ

2

構成ファイルを所有するパッケージを見つけます。

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

次のようなものが出力されます。

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

パッケージ名は「ユニティグリッター」なので、パッケージをダウンロードします。

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が提案したように、1つのライナーでそれを行うことができます。

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

1
単に元の場所に復元する場合は、doを実行してdpkg-deb --fsys-tarfile unity-greeter_version-0ubuntu1_amd64.deb | sudo tar x -C / ./etc/lightdm/unity-greeter.conf、展開tarする/前にcdします。
ムル

@muruが代替として追加されました;)
Ravexina

投票の際には常にコメントを残す
...-Ravexina

1

Ubuntu 17.04でも同じ問題が発生しました。ポストインストールでは、からのテンプレートを使用し/usr/share/openssh/ます。rootloginが有効かどうかを確認し、このオプションを設定してにコピーし/etc/sshます。その後、いくつかのucfおよびucfr呼び出しを実行します(その目的はわかりません)。

コピー/usr/share/openssh/sshd_config/etc/ssh/sshd_config

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

sshd_config必要に応じて調整してください。


0

これはすべての構成ファイルで機能するわけではありません。については/etc/nsswitch.confetc / nsswitch.confファイルを復元/再作成する方法を参照してください。でそのファイルを再構築することはできないようですdpkg-reconfigure


私は元の質問がlightdmについてだったけど、どうやら管理者が決定しました。この問題は、に関するすべての設定ファイルであること
ブラムジェロン

-1

ファイルを削除(バック)し、で再インストールunity-greeterapt-get install --reinstall unity-greeterます。


1
これは、構成ファイルを復元しません。
starbeamrainbowlabs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.