Die Datei / etc / hosts verweist auf eine andere Konfigurationsdatei


37

Wie kann ich die /etc/hostsDatei auf eine andere Konfigurationsdatei verweisen lassen, um eine Liste der Hosts zu erhalten?

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

Wie füge ich einen Link / eine Referenz zu einer /etc/hostsDatei hinzu, sodass ConfigFile.txt geladen wird?

Antworten:


39

Das kannst du nicht. Das Format für /etc/hostsist recht einfach und unterstützt keine zusätzlichen Dateien.

Es gibt ein paar Ansätze, die Sie stattdessen verwenden könnten:

  • Richten Sie einen (möglicherweise nur lokalen) DNS-Server ein. Einige davon bieten viel Flexibilität, und Sie können Ihre Host-Dateien definitiv auf mehrere Dateien oder sogar Maschinen verteilen. Andere (wie dnsmasq) bieten weniger (aber immer noch ausreichende) Flexibilität, sind jedoch einfach einzurichten. Wenn Sie versuchen, dieselbe Liste von Hosts auf einer Reihe von Computern einzuschließen, ist DNS wahrscheinlich die richtige Antwort.

  • Richten Sie einen anderen Namensdienst ein (NIS, LDAP usw.). Prüfen Sie in den glibc NSS-Dokumenten, was unterstützt wird. Persönlich denke ich, dass Sie DNS in den meisten Fällen verwenden sollten.

  • Erstellen Sie sich ein /etc/hosts.dVerzeichnis oder ähnliches und schreiben Sie einige Skripte, um sie alle miteinander zu verknüpfen (am einfachsten: cat /etc/hosts.d/*.conf > /etc/hostsSie sollten jedoch die Standardsortierung nach dem aktuellen Gebietsschema überschreiben), und führen Sie das Skript beim Booten aus, oder von cron oder manuell, wenn Sie die Dateien aktualisieren.

Persönlich, sowohl zu Hause als auch auf der Arbeit, muss ich BIND 9 ausführen, damit die Computernamen von jedem Gerät aufgelöst werden können. Das Erlernen dauert jedoch einige Stunden.


Vielen Dank! Ich fragte mich, warum jeder Versuch fehlschlug. Es wäre so viel einfacher, wenn es möglich wäre, aber ich werde die /etc/hosts.d
DogEatDog

8
@DogEatDog Ich empfehle, einen lokalen DNS-Server zu betreiben. Dnsmasq ist sehr einfach einzurichten; Bei benutzerfreundlichen Distributionen installieren Sie das Paket und es funktioniert einfach.
Gilles 'SO - hör auf böse zu sein'

@Gilles hat es richtig gemacht - dnsmasq macht wahrscheinlich genau das, was Sie in einem Heimnetzwerk wollen. Damit können Sie allen LAN-Ressourcen statische IP-Adressen nach MAC-Adresse zuweisen, ihnen Hostnamen zuweisen und Anforderungen für sie auflösen - und dabei unbekannte Hosts an einen vorgeschalteten DNS-Server weiterleiten.
Moodboom

@moodboom & Gilles Vielen Dank für den Vorschlag, ich habe es in der Antwort vermerkt. Ich bin mir nicht sicher, ob ich dnsmasq 2013 verwendet habe, aber ich bin es jetzt.
Derobert

Glob-Erweiterungen werden sortiert (zumindest in Bash nach LC_COLLATE), sodass die Einschränkung in Ihrer Antwort nicht gilt.
20.

2

Dies ist nicht möglich, da das Format normalerweise tief in der libc der Plattform kodiert ist. Es ist jedoch vorstellbar, dass ein Betriebssystem diese Funktion hinzufügt, was es zu einer plattformübergreifenden Lösung macht.

Alternativ können Sie einen bestimmten Block in Ihrer Hosts-Datei automatisch aktualisieren. Dies ist besonders hilfreich, wenn Sie über ein Skript verfügen, das Hosteinträge für ein bestimmtes Projekt dynamisch ausgibt (möglicherweise mit wechselnden IP-Adressen).

Hier ist ein Beispiel: Sie möchten Hosts aus dem Terraform-Status über erstellen terraform-inventory.

Relevante Inventarausgabe (z. B. Zuordnung eines EC2-Tags "Name" zu Gruppen mit jeweils genau einem 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")'

Skriptausgabe:

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

Und die Befehlszeile, um einen markierten Block /etc/hostsmit der Skriptausgabe zu aktualisieren :

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

Erläuterung:

  • Die erste Zeile erstellt offensichtlich ein Backup
  • Die in Klammern gesetzte Unterschale hat zwei sedAufrufe, um alle Zeilen vor und nach dem Beginn bzw. Ende der Markierung zu drucken. In jedem Fall fügen wir die Markierungen ein und setzen die Skriptausgabe zwischen diese Zeilen. Auch wenn das Skript fehlschlägt, müssen wir immer noch den Inhalt /etc/hosts(und die Sicherung in einem katastrophalen Szenario) umgeben.
  • sudo tee /etc/hosts.new Schreibt den weitergeleiteten Inhalt in eine neue Datei
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' druckt den aktualisierten Block aus
  • sudo mv /etc/hosts.new /etc/hostsverschiebt die neue Datei an ihren Platz. Dies muss in einem separaten Schritt erfolgen, da der Pipe-Puffer, wenn nicht genügend Speicherplatz tee /etc/hostsvorhanden ist, die Datei schreiben würde, während der vorhandene Inhalt noch gelesen wird.

1

Ich hatte eine ähnliche Anforderung an mich, von verschiedenen Standorten aus nahtlos mit dynamischen IPs zu arbeiten, zumal ich virtuelle Maschinen verwende. Meine einfache Lösung dafür lautet wie folgt:

  1. Erstellen Sie ein Skript zum Aktualisieren der Hosteinträge für jede Entität. Wenn ich beispielsweise einen Host mit dem Namen "myhost.net" und den Unterdomänen "app.myhost.net" habe, würde ich dieses Skript aufrufen und eine IP-Adresse angeben, die für jede Domäne geschrieben und in einer Hostdatei mit dem Namen gespeichert wird 'mein Gastgeber'. Das gleiche Skript verfügt über eine Markierung zum Löschen oder Aktualisieren einer einzelnen Hostdatei.

  2. Erstellen Sie ein anderes Skript, um diese Dateien in / etc / hosts zusammenzuführen. Dieses Skript findet alle von Ihnen erstellten Host-Dateien und führt sie in der Datei single hosts unter / etc / hosts zusammen.

Das hat bei mir perfekt geklappt. Ich arbeite aus der Ferne und muss manchmal aus irgendeinem Grund zwischen den Standorten wechseln. Außerdem muss ich diese eine Datei so oft bearbeiten. Stattdessen führe ich nur EIN Skript aus. Ja, ein Drehbuch. Das erste Skript führt automatisch das andere aus, um das Zusammenführen automatisch durchzuführen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.