El archivo / etc / hosts se refiere a otro archivo de configuración

38

¿Cómo puedo hacer que el /etc/hostsarchivo haga referencia a otro archivo de configuración para su lista de hosts?

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

¿Cómo agrego un enlace / referencia al /etc/hostsarchivo para que se cargue ConfigFile.txt?

Perro come perro
fuente

Respuestas:

40

No puedes El formato para /etc/hostses bastante simple y no admite la inclusión de archivos adicionales.

En su lugar, puede usar un par de enfoques:

  • Configure un servidor DNS (posiblemente solo local). Algunos de estos ofrecen mucha flexibilidad, y definitivamente puede distribuir sus archivos host en múltiples archivos, o incluso en máquinas. Otros (como dnsmasq) ofrecen menos flexibilidad (pero aún suficiente), pero son fáciles de configurar. Si está tratando de incluir la misma lista de hosts en un montón de máquinas, entonces DNS es probablemente la respuesta correcta.

  • Configure algún otro servicio de nombres (NIS, LDAP, etc.). Consulte los documentos glibc NSS para saber qué es compatible. Personalmente, creo que deberías usar DNS en la mayoría de los casos.

  • Conviértase en un /etc/hosts.ddirectorio o similar, y escriba algunos scripts para concatenarlos todos juntos (lo más trivial: cat /etc/hosts.d/*.conf > /etc/hostsaunque probablemente querrá un poco mejor, por ejemplo, anular el orden predeterminado por la ubicación actual) y ejecutar ese script en el arranque, o desde cron, o manualmente cada vez que actualice los archivos.

Personalmente, tanto en casa como en el trabajo, para que los nombres de las máquinas se puedan resolver desde cada dispositivo, ejecuto BIND 9. Sin embargo, eso requiere algunas horas para aprender.

derobert
fuente
¡Gracias! Me preguntaba por qué cada intento estaba fallando. Sería mucho más fácil si fuera posible, pero
usaré
8
@DogEatDog Recomiendo ejecutar un servidor DNS local. Dnsmasq es muy fácil de configurar; en distribuciones fáciles de usar, instala el paquete y simplemente funciona.
Gilles 'SO- deja de ser malvado'
@Gilles tiene razón: es probable que dnsmasq haga exactamente lo que desea en una red doméstica. Le permite asignar direcciones IP estáticas a todos sus recursos de LAN por dirección MAC, otorgarles nombres de host y resolver solicitudes, todo mientras permite que los hosts desconocidos pasen a un servidor DNS ascendente.
moodboom
@moodboom & Gilles Gracias por sugerir eso, lo he notado en la respuesta. No estoy seguro de si estaba usando dnsmasq en 2013, pero ciertamente lo estoy ahora.
derobert
Las expansiones de Glob se ordenan (al menos en Bash, según LC_COLLATE), por lo que la advertencia en su respuesta no se aplica.
l0b0
2

No es posible, ya que el formato suele estar profundamente codificado en la plataforma libc. Sin embargo, es imaginable que un sistema operativo agregue esta característica, por lo que no es una solución multiplataforma.

Alternativamente, puede actualizar automáticamente un determinado bloque en su archivo de hosts. Esto es particularmente útil si tiene un script que genera dinámicamente entradas de host para un determinado proyecto (posiblemente con cambios de IP).

Aquí hay un ejemplo: desea crear hosts desde el estado Terraform a través de terraform-inventory.

Salida de inventario relevante (por ejemplo, mapeando una etiqueta "Nombre" de EC2 a grupos de exactamente un host cada uno):

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

Salida de script:

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

Y la línea de comando para actualizar un bloque marcado /etc/hostscon la salida del 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

Explicación:

  • La primera línea obviamente crea una copia de seguridad
  • El subshell entre paréntesis tiene dos sedllamadas para imprimir todas las líneas antes y después del comienzo / final del marcador, respectivamente. Insertamos los marcadores en cualquier caso, colocando el resultado del script entre esas líneas. Incluso si el script falla, todavía tenemos que incluir el contenido de /etc/hosts(y la copia de seguridad en un escenario catastrófico).
  • sudo tee /etc/hosts.new escribe el contenido canalizado en un nuevo archivo
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' imprime el bloque actualizado para mayor comodidad
  • sudo mv /etc/hosts.new /etc/hostsmueve el nuevo archivo a su lugar. Esto debe hacerse en un paso separado porque si el búfer de tubería se queda sin espacio, tee /etc/hostscomenzaría a escribir el archivo mientras el contenido existente aún se está leyendo.
AndiDog
fuente
1

He tenido un requisito similar para trabajar sin problemas desde diferentes ubicaciones con IP dinámicas, especialmente desde que uso máquinas virtuales. Mi solución simple a esto es la siguiente:

  1. Cree un script para actualizar las entradas de host para cada entidad. Por ejemplo, si tengo un host llamado 'myhost.net', con subdominios 'app.myhost.net', invocaría ese script y proporcionaría una dirección IP que se escribirá para cada dominio y se guardará en un archivo host llamado 'Mi anfitrión'. El mismo script tiene una bandera para eliminar o actualizar un solo archivo host.

  2. Cree otro script para fusionar esos archivos en / etc / hosts. Este script encontrará todos los archivos de host que ha creado y los combinará en el único archivo de hosts en / etc / hosts.

Esto me ha funcionado perfectamente. Trabajo de forma remota y, a veces, necesito moverme de una ubicación a otra por cualquier motivo u otro, y la carga de editar ese archivo me agobia tantas veces. En cambio, solo ejecuto UN script. Sí, un guion. El primer script ejecuta automáticamente el otro para hacer la fusión automáticamente.

DesmondCampbell
fuente