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

29

Como posso obter o arquivo /etc/hosts para se referir 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 eu adiciono um link / referência ao arquivo /etc/hosts de tal forma que ConfigFile.txt será carregado?

    
por DogEatDog 07.01.2013 / 17:11

4 respostas

34

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

Existem algumas abordagens que você pode usar:

  • Configure um servidor DNS (possivelmente somente local). Algumas delas dão um muito de flexibilidade, e você pode definitivamente espalhar seus arquivos host através de múltiplos arquivos, ou até mesmo máquinas. Outros (como o dnsmasq) oferecem menos (mas ainda são suficientes) 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 algum outro serviço de nomes (NIS, LDAP, etc.). Verifique os documentos do NSS da glibc sobre o que é suportado. Pessoalmente, acho que você deveria usar o DNS na maioria dos casos.

  • Crie um diretório /etc/hosts.d ou similar e escreva alguns scripts para concatená-los (o mais trivial: cat /etc/hosts.d/*.conf > /etc/hosts , embora você provavelmente deseje um pouco melhor, por exemplo, substituir o padrão por localidade atual) e execute esse script na inicialização, no cron ou manualmente sempre que você atualizar os arquivos.

Pessoalmente, em casa e no trabalho, para ter nomes de máquinas resolvidos de todos os dispositivos, eu executo o BIND 9. Isso envolve algumas horas para aprender, no entanto.

    
por 07.01.2013 / 17:30
0

Semelhante a este Posso criar um arquivo de hosts específico do usuário para complementar o / etc / hosts? . AFAIK não é possível obter um arquivo externo associado ao arquivo /etc/hosts .

    
por 07.01.2013 / 17:24
0

Eu tive um requisito semelhante para que eu trabalhasse perfeitamente de diferentes locais com IPs dinâmicos, especialmente 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 subdomínios 'app.myhost.net', invoco esse script e forneço um endereço IP que será gravado para cada domínio e salvo em um arquivo host chamado 'meu hospedeiro'. O mesmo script tem 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. Eu trabalho remotamente e, às vezes, preciso alternar entre locais por qualquer motivo ou outro, e seria sobrecarregado pela demanda para editar esse arquivo tantas vezes. Em vez disso, apenas executo um script. Sim, um script. O primeiro script executa automaticamente o outro para fazer a fusão automaticamente.

    
por 22.12.2016 / 17:20
0

Não é possível, pois o formato geralmente é profundamente codificado em libc das plataformas. No entanto, é imaginável que um sistema operacional adicione esse recurso, tornando-o uma solução que não seja de plataforma cruzada.

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

Aqui está um exemplo: você quer criar hosts 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 em /etc/hosts com 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 subnível entre parênteses tem duas chamadas sed para imprimir todas as linhas antes e depois do início / fim do marcador, respectivamente. Nós inserimos os marcadores em qualquer caso, colocando a saída do script entre essas linhas. Mesmo se o script falhar, ainda temos que cercar o conteúdo 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/hosts move o novo arquivo para o lugar. Isso deve ser feito em uma etapa separada, porque se o buffer do canal ficar sem espaço, tee /etc/hosts começaria a gravar o arquivo enquanto o conteúdo existente ainda está sendo lido.
por 17.11.2018 / 22:10