Il file / etc / hosts fa riferimento a un altro file di configurazione


38

Come posso fare in modo che il /etc/hostsfile faccia riferimento a un altro file di configurazione per il suo elenco di host?

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

Come faccio ad aggiungere un collegamento / riferimento al /etc/hostsfile in modo tale che ConfigFile.txt venga caricato?

Risposte:


40

Non puoi. Il formato per /etc/hostsè abbastanza semplice e non supporta l'inclusione di file extra.

Ci sono invece un paio di approcci che potresti usare:

  • Configurare un server DNS (possibilmente solo locale). Alcuni di questi offrono molta flessibilità e puoi sicuramente distribuire i tuoi file host su più file o persino macchine. Altri (come dnsmasq) offrono una flessibilità minore (ma comunque sufficiente), ma sono facili da configurare. Se stai cercando di includere lo stesso elenco di host su un sacco di macchine, allora DNS è probabilmente la risposta giusta.

  • Imposta un altro servizio di denominazione (NIS, LDAP, ecc.). Controlla i documenti NSS di glibc per ciò che è supportato. Personalmente, penso che dovresti usare il DNS nella maggior parte dei casi.

  • Crea una /etc/hosts.ddirectory o simile e scrivi alcuni script per concatenarli tutti insieme (il più banale:, cat /etc/hosts.d/*.conf > /etc/hostsanche se probabilmente vorrai un po 'meglio, ad esempio, sovrascrivere l'ordinamento predefinito in base alle impostazioni locali correnti) ed eseguire quello script all'avvio, oppure da cron o manualmente ogni volta che aggiorni i file.

Personalmente, sia a casa che al lavoro, per avere nomi di macchine risolvibili da ogni dispositivo, eseguo BIND 9. Tuttavia, ci vogliono alcune ore per imparare.


Grazie! Mi chiedevo perché ogni tentativo fallisse. Sarebbe molto più semplice se fosse possibile, ma userò il file /etc/hosts.d
DogEatDog

8
@DogEatDog Raccomando di eseguire un server DNS locale. Dnsmasq è molto semplice da configurare; su distribuzioni intuitive, installi il pacchetto e funziona.
Gilles 'SO- smetti di essere malvagio' il

@Gilles ha ragione: dnsmasq probabilmente fa esattamente quello che vuoi su una rete domestica. Ti consente di assegnare IP statici a tutte le tue risorse LAN tramite l'indirizzo MAC, concedere loro nomi host e risolvere le richieste per loro, il tutto lasciando passare host sconosciuti a un server DNS upstream.
moodboom,

@moodboom & Gilles Grazie per avermelo suggerito, l'ho notato nella risposta. Non sono sicuro se stavo usando dnsmasq nel 2013, ma ora lo sono sicuramente.
derobert l'

Le espansioni globali sono ordinate (almeno in Bash, in base a LC_COLLATE), quindi l'avvertenza nella tua risposta non si applica.
1818

2

Non è possibile, dato che il formato è di solito profondamente codificato nella libc delle piattaforme. Tuttavia è immaginabile che un sistema operativo aggiunga questa funzionalità, rendendola una soluzione non multipiattaforma.

In alternativa, puoi aggiornare automaticamente un determinato blocco nel file hosts. Ciò è particolarmente utile se si dispone di uno script che genera in modo dinamico voci host per un determinato progetto o giù di lì (possibilmente con la modifica degli IP).

Ecco un esempio: vuoi creare host dallo stato Terraform tramite terraform-inventory.

Output di inventario pertinente (ad esempio, mappando un tag "Nome" EC2 su gruppi di esattamente un host ciascuno):

$ 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 dello script:

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

E la riga di comando per aggiornare un blocco contrassegnato /etc/hostscon l'output dello script :

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

Spiegazione:

  • La prima riga ovviamente crea un backup
  • La subshell tra parentesi ha due sedchiamate per stampare tutte le righe prima e dopo l'inizio / fine del marker, rispettivamente. Inseriamo gli indicatori in ogni caso, inserendo l'output dello script tra quelle righe. Anche se lo script fallisce, dobbiamo comunque circondare il contenuto di /etc/hosts(e il backup in uno scenario catastrofico).
  • sudo tee /etc/hosts.new scrive il contenuto reindirizzato in un nuovo file
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' stampa il blocco aggiornato per comodità
  • sudo mv /etc/hosts.new /etc/hostssposta il nuovo file in posizione. Questo deve essere fatto in una fase separata perché se il buffer della pipe esaurisce lo spazio, tee /etc/hostsinizierebbe a scrivere il file mentre il contenuto esistente è ancora in fase di lettura.

1

Ho avuto un requisito simile per poter lavorare senza problemi da diverse posizioni con IP dinamici, soprattutto da quando utilizzo macchine virtuali. La mia semplice soluzione è la seguente:

  1. Creare uno script per aggiornare le voci host per ciascuna entità. Ad esempio, se ho un host chiamato "myhost.net", con sottodomini "app.myhost.net", invoco lo script e fornire un indirizzo IP che verrà scritto per ciascun dominio e salvato in un file host chiamato "il mio ospite". Lo stesso script ha un flag per eliminare o aggiornare un singolo file host.

  2. Crea un altro script per unire quei file in / etc / hosts. Questo script troverà tutti i file host che hai creato e li unirà nel singolo file hosts su / etc / hosts.

Questo ha funzionato perfettamente per me. Lavoro a distanza e talvolta ho bisogno di spostarmi da una posizione all'altra per qualsiasi motivo o altro, e sarei gravato dalla richiesta di modificare quel file così tante volte. Invece eseguo solo UNO script. Sì, una sceneggiatura. Il primo script esegue automaticamente l'altro per eseguire automaticamente l'unione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.