web-dev-qa-db-ja.com

/ etc / hostsファイルが別の構成ファイルを参照している

/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

ConfigFile.txtが読み込まれるように/etc/hostsファイルにリンク/参照を追加するにはどうすればよいですか?

39
DogEatDog

できません。 /etc/hostsの形式は非常にシンプルで、追加のファイルを含めることはできません。

代わりに使用できる方法がいくつかあります。

  • (おそらくローカルのみの)DNSサーバーをセットアップします。これらの一部にはlotの柔軟性があり、ホストファイルを複数のファイルまたはマシンにまで確実に分散させることができます。他のもの(dnsmasqなど)は、柔軟性は低いですが(まだ十分です)、設定は簡単です。多数のマシンに同じホストのリストを含めようとしている場合、おそらくDNSが正解です。

  • 他のネームサービス(NIS、LDAPなど)を設定します。サポートされているものについては、glibc NSSドキュメントを確認してください。個人的には、ほとんどすべてのケースでDNSを使用するべきだと思います。

  • 自分自身を/etc/hosts.dディレクトリまたは同様のものにして、それらをすべて連結するスクリプトを記述します(最も簡単なもの:cat /etc/hosts.d/*.conf > /etc/hosts。ただし、現在のロケールでデフォルトのソートをオーバーライドするなど、少し改善したいと思うかもしれません。 )、そのスクリプトを起動時に、またはcronから、またはファイルを更新するたびに手動で実行します。

個人的には、自宅と職場の両方で、すべてのデバイスから解決可能なマシン名を取得するために、BIND 9を実行しています。

41
derobert

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

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

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

関連するインベントリ出力(たとえば、EC2の「名前」タグをそれぞれ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

説明:

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

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

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

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

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

1
DesmondCampbell

/etc/hostsでホストの追加と削除を処理する小さなbashスニペットを書きました。それは見つけることができます https://github.com/danfruehauf/Scripts/blob/master/mock-hosts/mock-hosts.sh

これを.bashrcに含めるだけで、/etc/hostsを変更する権限があることを確認してください。

0
Dan Fruehauf

これと同様 / etc/hostsを補完するためにユーザー固有のhostsファイルを作成できますか? 。私の知る限り、/etc/hostsファイルに関連付けられた外部ファイルを取得することはできません。

0
logoff