/ etc / hostsファイルは別の構成ファイルを参照します


38

/etc/hostsホストのリストの別の構成ファイルを参照するファイルを取得するにはどうすればよいですか?

/etc/hosts

 ## My Hosts
 127.0.0.1   localhost
 255.255.255.255 broadcasthost

 #Other Configurations
 <Link to /myPath/to/MyConfig/ConfigFile.txt>

 #Other Addresses
 3.3.3.3 MyAwesomeDomain.com
 4.4.4.4 SomeplaceIWantToGoTo.com

ConfigFile.txt

##My additional Hosts
1.1.1.1 SomeLocation.com
2.2.2.2 AnotherLocation.com

/etc/hostsConfigFile.txtがロードされるように、リンク/参照をファイルに追加するにはどうすればよいですか?

回答:


40

できません。の形式/etc/hostsは非常にシンプルで、余分なファイルを含めることはサポートしていません。

代わりに使用できるいくつかのアプローチがあります。

  • (おそらくローカルのみの)DNSサーバーをセットアップします。これらのいくつかは与える多くの柔軟性を、とあなたは間違いなく、複数のファイル、あるいはマシン上にホストファイルを広げることができます。他のもの(dnsmasqなど)は、柔軟性は劣ります(それでも十分です)が、セットアップは簡単です。多数のマシンに同じホストのリストを含めようとしている場合、おそらくDNSが正しい答えです。

  • 他のネームサービス(NIS、LDAPなど)をセットアップします。サポートされている内容については、glibc NSSドキュメントを確認してください。個人的には、ほとんどすべての場合にDNSを使用する必要があると思います。

  • 自分で/etc/hosts.dディレクトリなどを作成し、それらをすべて連結するスクリプトを作成します(最も簡単な例:cat /etc/hosts.d/*.conf > /etc/hostsおそらく、現在のロケールで既定の並べ替えをオーバーライドするなど、少し改善する必要があります)。または、起動時にそのスクリプトを実行します。 cronから、またはファイルを更新するたびに手動で。

個人的に、自宅と職場の両方で、すべてのデバイスからマシン名を解決できるようにするために、BIND 9を実行しています。ただし、学習には数時間かかります。


ありがとう!私は、それぞれの試みが失敗した理由を疑問に思っていました。可能であればそれは非常に簡単ですが、私は/etc/hosts.dを使用します
-DogEatDog

8
@DogEatDogローカルDNSサーバーを実行することをお勧めします。Dnsmasqのセットアップは非常に簡単です。ユーザーフレンドリーなディストリビューションでは、パッケージをインストールするだけで動作します。
ジル 'SO-悪

@Gillesにはそれがあります-dnsmasqはおそらく、ホームネットワークで望んでいることを正確に実行します。MACアドレスによってすべてのLANリソースに静的IPを割り当て、ホスト名を付与し、要求を解決します-未知のホストをアップストリームDNSサーバーにパススルーさせます。
ムードブーム

@moodboom&Gilles提案してくれてありがとう、答えでそれを書きました。2013年にdnsmasqを使用していたかどうかはわかりませんが、確かに今です。
デロバート

グローブの展開は(少なくともBashではによるとLC_COLLATEソートされるため、回答の警告は適用されません。
l0b0

2

フォーマットは通常、プラットフォームのlibcに深くコーディングされているため、不可能です。ただし、OSがこの機能を追加し、クロスプラットフォーム以外のソリューションにすること想像できます。

または、hostsファイルの特定のブロックを自動的に更新できます。これは、特定のプロジェクトなどのホストエントリを動的に出力するスクリプトがある場合(IPを変更した場合など)に特に役立ちます。

次に例を示しますterraform-inventory。を介してTerraform状態からホストを作成します。

関連するインベントリ出力(たとえば、EC2 "Name"タグをそれぞれ1つのホストのグループにマッピングする):

$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
  "name_myhost-a": [
    "10.101.118.131"
  ],
  "name_myhost-b": [
    "10.101.111.189"
  ]
}

print-updated-hosts-entries.sh

#!/bin/sh
exec terraform-inventory --list | \
    jq -r 'to_entries |
           map(select(.key | match("^name_"))) |
           map(.value[0] + " " + .key[5:]) |
           join("\n")'

スクリプト出力:

./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b

そして、スクリプト出力でマークされたブロックを更新するコマンドライン/etc/hosts

sudo cp /etc/hosts "/etc/hosts.bak.$(date +%Y%m%d%H%M%S)" && \
    (
        sed -n '1,/^# MYMARKER BEGIN/{/^# MYMARKER BEGIN/!p;}' /etc/hosts; \
        echo "# MYMARKER BEGIN"; \
        ./print-updated-hosts-entries.sh; \
        echo "# MYMARKER END"; \
        sed -n '/^# MYMARKER END/,${/^# MYMARKER END/!p;}' /etc/hosts; \
    ) | \
    sudo tee /etc/hosts.new | \
    sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' && \
        sudo mv /etc/hosts.new /etc/hosts

説明:

  • 最初の行は明らかにバックアップを作成します
  • 括弧内のサブシェルにはsed、マーカー開始/終了の前後のすべての行をそれぞれ印刷する2つの呼び出しがあります。いずれの場合もマーカーを挿入し、スクリプト出力をそれらの行の間に入れます。スクリプトが失敗しても、周囲のコンテンツ/etc/hosts(および壊滅的なシナリオでのバックアップ)が必要です。
  • sudo tee /etc/hosts.new パイプされたコンテンツを新しいファイルに書き込みます
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' 便宜上、更新されたブロックを出力します
  • sudo mv /etc/hosts.new /etc/hosts新しいファイルを所定の場所に移動します。パイプバッファの領域が不足するとtee /etc/hosts、既存のコンテンツの読み取り中にファイルの書き込みが開始されるため、これは別の手順で行う必要があります。

1

特に仮想マシンを使用しているので、動的IPを使用してさまざまな場所からシームレスに作業するための同様の要件がありました。これに対する私の簡単な解決策は次のとおりです。

  1. 各エンティティのホストエントリを更新するスクリプトを作成します。たとえば、サブドメイン「app.myhost.net」を持つ「myhost.net」というホストがある場合、そのスクリプトを呼び出して、各ドメインに書き込まれ、ホストファイルに保存されるIPアドレスを提供します「私のホスト」。同じスクリプトには、単一のホストファイルを削除または更新するためのフラグがあります。

  2. これらのファイルを/ etc / hostsにマージする別のスクリプトを作成します。このスクリプトは、作成したすべてのホストファイルを検索し、それらを/ etc / hostsの単一のホストファイルにマージします。

これは私にとって完璧に機能しました。私はリモートで作業しており、何らかの理由で場所間を移動する必要がある場合があり、そのファイルを何度も編集するという要求に悩まされます。代わりに、1つのスクリプトを実行するだけです。はい、1つのスクリプト。最初のスクリプトは、他のスクリプトを自動的に実行して、マージを自動的に実行します。

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