/ etc / hosts file merujuk ke file konfigurasi lain

38

Bagaimana saya bisa mendapatkan /etc/hostsfile untuk merujuk ke file konfigurasi lain untuk daftar host?

contoh /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

Bagaimana cara menambahkan tautan / Referensi ke /etc/hostsfile sehingga ConfigFile.txt akan dimuat?

Anjing makan anjing
sumber

Jawaban:

40

Kamu tidak bisa Format untuk /etc/hostsini cukup sederhana, dan tidak mendukung termasuk file tambahan.

Ada beberapa pendekatan yang bisa Anda gunakan sebagai gantinya:

  • Menyiapkan server DNS (mungkin hanya lokal). Beberapa di antaranya memberikan banyak fleksibilitas, dan Anda pasti dapat menyebarkan file host Anda ke beberapa file, atau bahkan mesin. Lainnya (seperti dnsmasq) menawarkan fleksibilitas yang lebih sedikit (tetapi masih cukup), tetapi mudah untuk diatur. Jika Anda mencoba memasukkan daftar host yang sama pada banyak mesin, maka DNS mungkin adalah jawaban yang tepat.

  • Siapkan beberapa layanan nama lain (NIS, LDAP, dll.) Periksa glibc NSS docs untuk mengetahui apa yang didukung. Secara pribadi, saya pikir Anda harus menggunakan DNS di sebagian besar semua kasus.

  • Jadikan diri Anda /etc/hosts.ddirektori atau sejenisnya, dan tulis beberapa skrip untuk menyatukan semuanya (paling sepele:, cat /etc/hosts.d/*.conf > /etc/hostsmeskipun Anda mungkin ingin sedikit lebih baik misalnya, menimpa penyortiran default berdasarkan lokasi saat ini), dan menjalankan skrip itu saat boot, atau dari cron, atau secara manual setiap kali Anda memperbarui file.

Secara pribadi, baik di rumah maupun di kantor, untuk memiliki nama mesin yang dapat diatasi dari setiap perangkat, saya menjalankan BIND 9. Namun, hal itu memerlukan beberapa jam untuk dipelajari.

derobert
sumber
Terima kasih! Saya bertanya-tanya mengapa setiap upaya gagal. Akan jauh lebih mudah jika itu mungkin, tapi saya akan menggunakan /etc/hosts.d
DogEatDog
8
@DogEatDog Saya sarankan menjalankan server DNS lokal. Dnsmasq sangat mudah diatur; pada distribusi yang mudah digunakan, Anda menginstal paket dan hanya berfungsi.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles benar - dnsmasq kemungkinan melakukan apa yang Anda inginkan di jaringan rumah. Ini memungkinkan Anda menetapkan IP statis untuk semua sumber daya LAN Anda berdasarkan alamat MAC, memberi mereka nama host, dan menyelesaikan permintaan mereka - semua sambil membiarkan host yang tidak dikenal melewati ke server DNS upstream.
moodboom
@moodboom & Gilles Terima kasih telah menyarankan itu, saya telah mencatatnya dalam jawaban. Tidak yakin apakah saya menggunakan dnsmasq pada tahun 2013, tapi saya pasti sekarang.
derobert
Ekspansi Glob diurutkan (setidaknya dalam Bash, menurut LC_COLLATE), sehingga peringatan dalam jawaban Anda tidak berlaku.
l0b0
2

Itu tidak mungkin, karena format biasanya sangat dikodekan ke dalam libc platform. Namun adalah dibayangkan bahwa OS menambahkan fitur ini, membuatnya menjadi solusi non cross-platform.

Atau, Anda dapat secara otomatis memperbarui blok tertentu di file host Anda. Ini sangat membantu jika Anda memiliki skrip yang secara dinamis menampilkan entri host untuk proyek tertentu atau lebih (mungkin dengan mengubah IP).

Berikut ini contohnya: Anda ingin membuat host dari keadaan Terraform via terraform-inventory.

Output inventaris yang relevan (misalnya, memetakan tag "Nama" EC2 ke grup yang masing-masing memiliki satu host):

$ 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")'

Output skrip:

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

Dan baris perintah untuk memperbarui blok yang ditandai /etc/hostsdengan output skrip :

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

Penjelasan:

  • Baris pertama jelas membuat cadangan
  • Subkulit dalam tanda kurung memiliki dua sedpanggilan untuk mencetak semua baris sebelum dan sesudah penanda dimulai / berakhir, masing-masing. Kami menyisipkan penanda dalam kasus apa pun, menempatkan output skrip di antara baris-baris itu. Bahkan jika skrip gagal, kita masih harus melingkupi konten /etc/hosts(dan cadangan dalam skenario bencana).
  • sudo tee /etc/hosts.new menulis konten yang disalurkan ke file baru
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' mencetak blok yang diperbarui untuk kenyamanan
  • sudo mv /etc/hosts.new /etc/hostsmemindahkan file baru ke tempatnya. Ini harus dilakukan dalam langkah terpisah karena jika buffer pipa kehabisan ruang, tee /etc/hostsakan mulai menulis file sementara konten yang ada masih dibaca.
AndiDog
sumber
1

Saya memiliki persyaratan yang sama agar saya dapat bekerja dengan mulus dari berbagai lokasi dengan IP dinamis, terutama karena saya menggunakan mesin virtual. Solusi sederhana saya untuk ini adalah sebagai berikut:

  1. Buat skrip untuk memperbarui entri host untuk setiap entitas. Misalnya, jika saya memiliki host yang disebut 'myhost.net', dengan sub-domain 'app.myhost.net', saya akan memanggil skrip itu dan memberikan alamat IP yang akan ditulis untuk setiap domain dan disimpan dalam file host yang disebut 'Tuan rumahku'. Skrip yang sama memiliki bendera untuk menghapus atau memperbarui file host tunggal.

  2. Buat skrip lain untuk menggabungkan file-file itu ke / etc / hosts. Skrip ini akan menemukan semua file host yang Anda buat dan menggabungkannya ke file host tunggal di / etc / hosts.

Ini bekerja dengan baik untuk saya. Saya bekerja dari jarak jauh dan kadang-kadang perlu berpindah antar lokasi dengan alasan apa pun, dan akan terbebani oleh permintaan untuk mengedit satu file berkali-kali. Sebaliknya saya hanya menjalankan SATU skrip. Ya, satu skrip. Script pertama secara otomatis menjalankan yang lain untuk melakukan penggabungan secara otomatis.

DesmondCampbell
sumber