O arquivo / etc / hosts se refere a outro arquivo de configuração

38

Como faço para que o /etc/hostsarquivo se refira a outro arquivo de configuração para sua lista de hosts?

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

Como adiciono um link / referência ao /etc/hostsarquivo para que o ConfigFile.txt seja carregado?

Cão come cão
fonte

Respostas:

40

Você não pode. O formato para /etc/hostsé bastante simples e não suporta a inclusão de arquivos extras.

Existem algumas abordagens que você pode usar:

  • Configure um servidor DNS (possivelmente apenas local). Alguns deles oferecem muita flexibilidade, e você pode definitivamente espalhar seus arquivos host por vários arquivos ou até máquinas. Outros (como o dnsmasq) oferecem menos (mas ainda suficiente) flexibilidade, mas são fáceis de configurar. Se você está tentando incluir a mesma lista de hosts em várias máquinas, o DNS provavelmente é a resposta certa.

  • Configure outro serviço de nomes (NIS, LDAP, etc.). Verifique os documentos glibc NSS para saber o que é suportado. Pessoalmente, acho que você deve usar o DNS na maioria dos casos.

  • Crie um /etc/hosts.ddiretório ou similar e escreva alguns scripts para concatená-los todos juntos (o mais trivial: cat /etc/hosts.d/*.conf > /etc/hostsembora você provavelmente deseje um pouco melhor, por exemplo, substituir a classificação padrão pelo código de idioma atual) e execute esse script na inicialização, ou do cron ou manualmente sempre que você atualizar os arquivos.

Pessoalmente, em casa e no trabalho, para ter nomes de máquinas resolvíveis em todos os dispositivos, eu executo o BIND 9. Porém, isso envolve algumas horas para aprender.

derobert
fonte
Obrigado! Fiquei me perguntando por que cada tentativa estava falhando. Seria muito mais fácil se fosse possível, mas vou usar o /etc/hosts.d
dogeatdog
8
@ DogEatDog Eu recomendo executar um servidor DNS local. Dnsmasq é muito fácil de configurar; em distribuições fáceis de usar, você instala o pacote e ele simplesmente funciona.
Gilles 'SO- stop be evil'
A @Gilles está certa - o dnsmasq provavelmente faz exatamente o que você deseja em uma rede doméstica. Permite atribuir IPs estáticos a todos os seus recursos de LAN por endereço MAC, conceder nomes de host e resolver solicitações para eles - enquanto permite que hosts desconhecidos passem para um servidor DNS upstream.
Moodboom 11/11/16
@moodboom & Gilles Obrigado por sugerir isso, observei na resposta. Não tenho certeza se estava usando o dnsmasq em 2013, mas certamente estou agora.
derobert
As expansões de globos são classificadas (pelo menos em Bash, de acordo com LC_COLLATE), para que a ressalva em sua resposta não se aplique.
L0b0 20/0318
2

Não é possível, pois o formato geralmente é profundamente codificado na libc das plataformas. No entanto, é possível que um sistema operacional adicione esse recurso, tornando-o uma solução não multiplataforma.

Como alternativa, você pode atualizar automaticamente um determinado bloco no seu arquivo hosts. Isso é particularmente útil se você tiver um script que produz dinamicamente entradas de host para um determinado projeto ou mais (possivelmente com alteração de IPs).

Aqui está um exemplo: você deseja criar hosts a partir do estado Terraform via terraform-inventory.

Saída de inventário relevante (por exemplo, mapeando uma tag "Nome" do EC2 para grupos de exatamente um host cada):

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

Saída de script:

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

E a linha de comando para atualizar um bloco marcado /etc/hostscom a saída do 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

Explicação:

  • A primeira linha obviamente cria um backup
  • O subshell entre parênteses possui duas sedchamadas para imprimir todas as linhas antes e depois do início / fim do marcador, respectivamente. Em qualquer caso, inserimos os marcadores, colocando a saída do script entre essas linhas. Mesmo se o script falhar, ainda temos o conteúdo circundante de /etc/hosts(e o backup em um cenário catastrófico).
  • sudo tee /etc/hosts.new grava o conteúdo canalizado em um novo arquivo
  • sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' imprime o bloco atualizado por conveniência
  • sudo mv /etc/hosts.new /etc/hostsmove o novo arquivo no lugar. Isso deve ser feito em uma etapa separada, porque se o buffer do canal ficar sem espaço, tee /etc/hostscomeçaria a gravar o arquivo enquanto o conteúdo existente ainda estiver sendo lido.
AndiDog
fonte
1

Eu tinha um requisito semelhante para eu trabalhar sem interrupções em locais diferentes com IPs dinâmicos, principalmente porque uso máquinas virtuais. Minha solução simples para isso é a seguinte:

  1. Crie um script para atualizar as entradas do host para cada entidade. Por exemplo, se eu tiver um host chamado 'myhost.net', com os subdomínios 'app.myhost.net', eu chamaria esse script e forneceria um endereço IP que será gravado para cada domínio e salvo em um arquivo host chamado 'meu hospedeiro'. O mesmo script possui um sinalizador para excluir ou atualizar um único arquivo host.

  2. Crie outro script para mesclar esses arquivos em / etc / hosts. Este script encontrará todos os arquivos de host que você criou e os mesclará no arquivo de hosts únicos em / etc / hosts.

Isso funcionou para mim perfeitamente. Trabalho remotamente e às vezes preciso me mover entre locais por qualquer motivo ou outro e ficaria sobrecarregado com a demanda de editar esse arquivo tantas vezes. Em vez disso, apenas executei um script. Sim, um script. O primeiro script executa automaticamente o outro para fazer a mesclagem automaticamente.

DesmondCampbell
fonte