/ etc / hosts dosyası başka bir yapılandırma dosyasına bakın


37

/etc/hostsDosyayı ana bilgisayar listesi için başka bir yapılandırma dosyasına yönlendirmesini nasıl sağlayabilirim ?

Örnek /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 dosyasının yükleneceği şekilde bir linke / Reference dosyasına nasıl eklerim ?

Yanıtlar:


39

Yapamazsın Biçimi /etc/hostsoldukça basittir ve fazladan dosyalar da dahil değildir.

Bunun yerine kullanabileceğiniz birkaç yaklaşım var:

  • (Yalnızca yerel) bir DNS sunucusu kurun. Bunlardan bazıları çok fazla esneklik sağlar ve ana bilgisayar dosyalarınızı kesinlikle birden fazla dosyaya veya hatta makinelere yayabilirsiniz. Diğerleri (dnsmasq gibi) daha az (ancak yine de yeterli) esneklik sunar, ancak ayarlanması kolaydır. Bir grup makineye aynı ana bilgisayar listesini eklemeye çalışıyorsanız, DNS muhtemelen doğru cevaptır.

  • Başka bir ad servisi (NIS, LDAP, vb.) Ayarlayın. Desteklenenler için glibc NSS belgelerine bakın. Şahsen, çoğu durumda DNS kullanmanız gerektiğini düşünüyorum.

  • Kendinizi bir /etc/hosts.ddizin veya benzeri yapın ve hepsini bir araya getirmek için bazı komut dosyaları yazın (en önemsiz:, cat /etc/hosts.d/*.conf > /etc/hostsmuhtemelen şu anki yerel ayara göre varsayılan sıralama ayarını geçersiz kılmak için biraz daha iyi olmak isteyebilirsiniz) ve Dosyaları güncellediğinizde cron’dan veya manuel olarak

Şahsen, hem evde hem de işte, makine isimlerinin her cihazdan çözülebilmesi için BIND 9 çalıştırıyorum. Ancak bu, öğrenilmesi birkaç saat sürüyor.


Teşekkürler! Her denemenin neden başarısız olduğunu merak ediyordum. Mümkün olsaydı çok daha kolay olurdu, ama /etc/hosts.d kullanacağım
DogEatDog

8
@DogEatDog Yerel bir DNS sunucusu çalıştırmanızı öneririz. Dnsmasq'ın kurulması çok kolaydır; kullanıcı dostu dağıtımlarda, paketi yüklüyorsunuz ve sadece çalışıyor.
Gilles 'SO- kötülük'

@ Gilles haklı - dnsmasq muhtemelen ev ağında tam olarak ne istiyorsa onu yapıyor. Tüm LAN kaynaklarınıza MAC adreslerine göre statik IP atamanıza, ana bilgisayar adları vermenize ve bunlar için istekleri çözmenize olanak tanır - hepsi bilinmeyen ana bilgisayarların bir yukarı akış DNS sunucusuna geçmesine izin verir.
moodboom

@moodboom & Gilles Bunu önerdiğiniz için teşekkür ederim, cevabını yazdım. 2013'te dnsmasq kullanıp kullanmadığımdan emin değilim, ama kesinlikle öyleyim.
derobert

Glob genişlemeleri sıralanır (en azından Bash'e göre LC_COLLATE), bu nedenle cevabınızdaki uyarı geçerli değildir.
l0b0

2

Bu mümkün değildir, çünkü format genellikle platformların libc'sine derinden kodlanmıştır. Ancak bir işletim sisteminin bu özelliği eklediği ve platformlar arası olmayan bir çözüm olduğu düşünülebilir.

Alternatif olarak, ana makinenizdeki belirli bir bloğu otomatik olarak güncelleyebilirsiniz. Bu, belirli bir proje için ana bilgisayar girişlerini dinamik olarak çıkaran bir komut dosyanız varsa (belki de değişen IP'ler), bu özellikle yararlıdır.

İşte bir örnek: Terraform eyaletinden ana bilgisayarlar oluşturmak istiyorsunuz terraform-inventory.

İlgili envanter çıktısı (örneğin, bir EC2 "Ad" etiketinin her birinin tam olarak bir ana bilgisayar grubuyla eşleştirilmesi):

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

Komut dosyası çıktısı:

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

Ve işaretli bir bloğu /etc/hostsscript çıktısıyla güncellemek için komut satırı :

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

Açıklama:

  • İlk satır açıkçası bir yedekleme yaratıyor
  • Parantez içindeki alt kabuk sed, sırasıyla marker başlama / bitişinden önceki ve sonraki tüm satırları yazdırmak için iki çağrıya sahiptir. İşaretleyicileri her durumda komut dosyasının çıktısını bu satırların arasına koyarak yerleştiririz. Senaryo başarısız olsa bile, çevreleyen içeriğe /etc/hosts(ve felaket bir senaryoda yedeklemeye) ihtiyacımız var.
  • sudo tee /etc/hosts.new piped içeriğini yeni bir dosyaya yazar
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' güncellenmiş bloğu rahatlık için yazdırır
  • sudo mv /etc/hosts.new /etc/hostsyeni dosyayı yerine taşır. Bu, ayrı bir adımda yapılmalıdır, çünkü eğer boru tamponu boşluk biterse tee /etc/hosts, mevcut içerik hala okunurken dosyayı yazmaya başlayacaktır.

1

Dinamik IP'lerle farklı konumlardan sorunsuz çalışmam için, özellikle sanal makineler kullandığım için de benzer bir gereksinim vardı. Bu benim basit çözümüm şöyle:

  1. Her varlık için ana bilgisayar girişlerini güncellemek üzere bir komut dosyası oluşturun. Örneğin, 'myhost.net' adında bir ana makinem varsa, alt etki alanları 'app.myhost.net' varsa, bu betiği çağırır ve her etki alanı için yazılacak ve adı verilen bir ana bilgisayar dosyasına kaydedilmiş bir IP adresi veririm. 'benim ev sahibim'. Aynı komut dosyasında, tek bir ana bilgisayar dosyasını silmek veya güncellemek için bir bayrak bulunur.

  2. Bu dosyaları / etc / hosts dosyasında birleştirmek için başka bir komut dosyası oluşturun. Bu komut dosyası, oluşturduğunuz tüm ana bilgisayar dosyalarını bulur ve / etc / hosts adresindeki tek ana bilgisayar dosyasına birleştirir.

Bu benim için mükemmel çalıştı. Uzaktan çalışıyorum ve bazen herhangi bir nedenden ötürü yerler arasında hareket etmem gerekiyor ve bu dosyayı bir çok defa düzenleme talebi beni zorluyor. Bunun yerine sadece bir script çalıştırdım. Evet, bir senaryo. İlk komut dosyası otomatik olarak birleştirmeyi yapmak için diğerini otomatik olarak çalıştırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.