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?

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.


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.

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.