/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
構成ファイル.txt
##My additional Hosts
1.1.1.1 SomeLocation.com
2.2.2.2 AnotherLocation.com
/etc/hosts
ConfigFile.txtがロードされるようにファイルへのリンク/参照をどのように追加しますか?
答え1
あなたはできません。フォーマットは/etc/hosts
非常に簡単で、追加ファイルの埋め込みをサポートしていません。
使用できる方法はいくつかあります。
(ローカル専用の場合もあります)DNSサーバーを設定します。そのうちのいくつかは与えられますたくさん柔軟性により、ホストファイルを複数のファイルまたはコンピュータに分散させることができます。 dnsmasqなどの他のものは柔軟性が低くなりますが(まだ十分です)、設定は簡単です。複数のコンピュータに同じホストのリストを含めたい場合は、おそらくDNSが正しいでしょう。
別のネームサービス(NIS、LDAPなど)を設定します。サポートされている内容については、glibc NSSのマニュアルを確認してください。個人的にはほとんどの場合、DNSを使用する必要があると思います。
自分自身をディレクトリや同様のものにし、スクリプトを作成
/etc/hosts.d
して一緒に結合し(最も簡単な方法:cat /etc/hosts.d/*.conf > /etc/hosts
現在のロケールによるデフォルトのソートをオーバーライドするなど、より良い方法が必要な場合があります)、起動時またはcronでそのスクリプトを実行するか、などの場合は、手動でそのスクリプトを実行します。ファイルを更新します。
個人的に自宅でも職場でも、すべてのデバイスでコンピュータ名を確認できるようにするには、BIND 9を実行します。しかし、数時間の勉強が必要です。
答え2
フォーマットは通常プラットフォームのlibcに深くエンコードされているため、これは不可能です。しかしそれははい想像できるように、オペレーティングシステムはこの機能を追加してクロスプラットフォームではなくソリューションにしました。
あるいは、ホストファイルの特定のブロックを自動的に更新することもできます。これは、プロジェクトのホストエントリを動的に出力するスクリプト(IP変更可能)がある場合に特に便利です。
例は次のとおりです。次のようにして、Terraform状態でホストを作成しようとしています。terraform-inventory
。
関連インベントリ出力(たとえば、1つのホストのみを含むグループへのEC2「名前」タグマッピング):
$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
"name_myhost-a": [
"10.101.118.131"
],
"name_myhost-b": [
"10.101.111.189"
]
}
更新されたホストエントリの印刷.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
既存のコンテンツの読み込み中にファイルの書き込みが開始されるため、これは別の手順で実行する必要があります。
答え3
私は同様の要件を持ち、特に仮想マシンを使用しているため、さまざまな場所でシームレスに作業するには動的IPを使用する必要があります。これに対する私の簡単な解決策は次のとおりです。
各エンティティのホストエントリを更新するスクリプトを作成します。たとえば、サブドメインが「app.myhost.net」である「myhost.net」というホストがある場合は、スクリプトを呼び出して各ドメインに対して作成および保存されるIPアドレスを「myhosts」というホストファイルに提供します。同じスクリプトには、単一のホストファイルを削除または更新するためのフラグがあります。
これらのファイルを/ etc / hostsにマージする別のスクリプトを作成します。このスクリプトは、生成したすべてのホストファイルを見つけ、/ etc / hostsにある単一のホストファイルにマージします。
これは私にとって非常に効果的です。私はリモートで作業し、時には何らかの理由で場所間を移動し、ファイルを何度も編集する必要があるという負担を感じることがあります。代わりにスクリプトを実行します。はい、スクリプトです。最初のスクリプトは自動的に別のスクリプトを実行してマージを自動化します。
答え4
以下はいくつかの簡単なヒントです。
「プライベートホスト」というファイルを作成します。
すべてのカスタムホストをこのファイルに保存します。
次に、テキストファイルを「ホスト」に追加します。
cat personal-hosts >> hosts
この簡単な方法は、ホストのリストが120,000を超える非常に大きなホストに手間をかけずにサーバーを追加するのに役立ちました。