Como obter o nome do host de um servidor DHCP

Respostas:

6

Existe uma maneira de fazer isso com um pequeno script para um gancho dhcp, conforme descrito aqui .

Crie um novo arquivo:

sudoedit /etc/dhcp/dhclient-exit-hooks.d/hostname

e cole o seguinte código:

#!/bin/sh
# Filename:     /etc/dhcp/dhclient-exit-hooks.d/hostname
# Purpose:      Used by dhclient-script to set the hostname of the system
#               to match the DNS information for the host as provided by
#               DHCP.
#


# Do not update hostname for virtual machine IP assignments
if [ "$interface" != "eth0" ] && [ "$interface" != "wlan0" ]
then
    return
fi


if [ "$reason" != BOUND ] && [ "$reason" != RENEW ] \
   && [ "$reason" != REBIND ] && [ "$reason" != REBOOT ]
then
        return
fi

echo dhclient-exit-hooks.d/hostname: Dynamic IP address = $new_ip_address
hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -r 's/((.*)[^\.])\.?/\1/g' )
echo $hostname > /etc/hostname
hostname $hostname
echo dhclient-exit-hooks.d/hostname: Dynamic Hostname = $hostname

Substitua eth0e wlan0pelos nomes das interfaces das quais você deseja obter o nome do host. Na maioria dos casos eth0e wlan0deve permanecer o mesmo.

Verifique se é legível ...

chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname

Isso é tudo. Na próxima resposta dhcp, o nome do host será atualizado automaticamente.

d_inevitable
fonte
esse script realmente usa uma consulta DNS (usando o hostcomando) para extrair o nome do host associado ao endereço IP atribuído. Na verdade, os servidores DHCP podem definir explicitamente uma opção de nome de host (opção 12), que pode ser diferente do nome de host que você obtém de uma consulta DNS no IP (isso também pode falhar, se nenhum registro PTR para o IP existir no DNS )
Ale
4

Você pode obter seu nome de host no servidor DHCP - faz parte da especificação DHCP.

https://tools.ietf.org/html/rfc1533#section-3.14

"Esta opção especifica o nome do cliente"

Dave Morris
fonte
3
Como você obtém o servidor para enviá-lo?
Olathe
3

A resposta de d_inevitable quase resolveu meu problema, mas não completamente. O problema era que, embora:

  1. O servidor DHCP estava enviando um nome de host (adicionando o

    option host name 'client1' 
    

    no dhcpd.conf) e verifiquei capturando e analisando o conteúdo da oferta DHCP com o wireshark

  2. O cliente DHCP esperava o nome do host do servidor DHCP (adicionando

    request host-name 
    

    no dhclient.conf)

O cliente não estava recebendo um novo nome de host (facilmente verificado digitando

hostname

no terminal e obtendo o nome do host antigo ou nenhum nome do host, se eu tivesse excluído o conteúdo / arquivo). Como resultado, a solução proposta por d_inevitable estava apenas copiando uma sequência vazia.

Para resolver isso, apliquei uma solução grosseira, que geralmente não deve ser seguida, a menos que você esteja desesperado para fazê-la funcionar, como eu.

Primeiro, abra com capacidade de edição o script de controle do cliente DHCP:

sudo vi /sbin/dhclient-script

Lá, você terá que localizar a função

set_hostname()

Basta usar a pesquisa e ela deve aparecer. Agora, pelo menos no meu computador, essa função tem três condições if-then-else, encapsuladas uma à outra:

# set nome do host set_hostname () {local current_hostname

if [ -n "$new_host_name" ]; then
    current_hostname=$(hostname)

    # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP
    if [ -z "$current_hostname" ] ||
       [ "$current_hostname" = '(none)' ] ||
       [ "$current_hostname" = 'localhost' ] ||
       [ "$current_hostname" = "$old_host_name" ]; then
       if [ "$new_host_name" != "$old_host_name" ]; then
           hostname "$new_host_name"
       fi
    fi
fi }

Agora, o que você precisa é forçar a atribuição do novo nome de host ao seu host, não importa o quê. Portanto, você deseja comentar os dois encapsulados se-então-outro. O resultado deve ser algo como:

# set nome do host set_hostname () {local current_hostname

if [ -n "$new_host_name" ]; then
    current_hostname=$(hostname)

    # current host name is empty, '(none)' or 'localhost' or differs from new one from DHCP
    #if [ -z "$current_hostname" ] ||
    #   [ "$current_hostname" = '(none)' ] ||
    #   [ "$current_hostname" = 'localhost' ] ||
    #   [ "$current_hostname" = "$old_host_name" ]; then
    #   if [ "$new_host_name" != "$old_host_name" ]; then
           hostname "$new_host_name"
    #   fi
    #fi
fi }

Agora o d_inevitable ou isso deve funcionar como esperado. Espero que ajude se você estiver em uma frustração desesperada semelhante à minha.

George
fonte
3

A resposta de Oli é comprovadamente falsa ("Você não obtém seu nome de host do servidor DHCP"), como evidenciado pelas outras respostas aqui e também pela minha experiência recente em um sistema RHEL7. Esse sistema recebeu seu nome de host do servidor DHCP.

E, de fato, há coisas nos arquivos de configuração do DHCP que devem fazer isso acontecer. Por exemplo:

host host4 {   # verified                                                                                                                                                                                                                   
  hardware ethernet  41:88:22:11:33:22;
  fixed-address 192.168.0.4;                                                                                                                                                                                 
  option host-name "host4";
}

Deveria dizer ao host que seu nome é host4.

Como se vê, o dhclient do isc NÃO APOIA APOIAR ISSO!

No entanto, o dhcpcd5, pronto para uso. Pare o dhclient, instale o dhcpcd5, execute o dhcpcd, renove sua concessão e, poof, o nome do host no seu cliente DHCP está definido como o nome enviado do servidor DHCP. Sem dhclient-exit-hooks.dscripts, sem invasões rc.local, nada.

Como nota final, passei muito tempo tentando fazer isso funcionar usando o dhclient do ISC. Absolutamente nenhuma alegria, mesmo quando o servidor envia o nome do host.

Minha solução inicial para o problema foi escrever um código atraente rc.localpara detectar quando a rede surgiu e forçar uma (no meu caso) uma pesquisa /etc/hostspara obter o nome do host e depois executar hostnamecom esse nome de host. Funciona, mas até a rede aparecer, seu nome de host provavelmente está errado (quando eu implanto um host pela primeira vez, removo /etc/hostname, então o nome do host fica localhostaté eu poder executar /etc/init.d/hostname.sh startuma vez que a rede é criada - portanto, ao obter um novo nome pela primeira vez, é necessário inicializar duas vezes - uma vez para obter seu nome de host e uma vez para ter esse nome disponível quando tudo for iniciado ...).

RustyCar
fonte
1

Você não obtém seu nome de host do servidor DHCP.

Você pode enviar seu nome de host para o servidor, o que pode alterar o IP atribuído. Você pode alterar o nome enviado editando sua conexão do Network Manager (o campo é chamado de DHCP Client ID) ou pode editar (como raiz) /etc/dhcp/dhclient.conf. Procure a linha que diz:

send host-name "<hostname>";

... e mude <hostname>para o que quiser.


Por padrão, o Ubuntu obterá as configurações de DNS do roteador (se as enviar), mas desconfio que você esteja falando de DNS / mDNS local onde é possível acessar outros computadores pelo nome do host. Isso é chamado Ahavi ou Zeroconf no Ubuntu e é instalado por padrão.

Você deve poder acessar seu computador <hostname>.local

Oli
fonte
Eu tenho servidor dns e dhcp (windows 2008) na minha rede. O Ant atribui o nome do host e o nome do DNS a cada ip, mas o ubuntu não atualiza o nome do host e o nome do DNS. Eu devo conseguir ver esse nome de host atribuído digitando hostnamee domínio digitando hostname -d. por isso é fqdn deve ser hostname.domain
Oguz Bilgic
AFAIR, se o cliente não ingressar no domínio do Windows, o servidor DHCP do Windows não atualizará dinamicamente as entradas DNS do Windows. Eu realmente não estou certo que ... depende da configuração do Windows DHCP / DNS
oddfellow
Por padrão, o 12.04 possui esta linha "send host-name = gethostname ();" e você pode ver esse valor digitando "hostname" na linha de comando. Por padrão, isso não terá nenhum efeito em uma rede Windows. Conforme a pergunta original.
Moz
Embora o zeroconf esteja instalado por padrão, ele é terrivelmente não confiável. Estou francamente surpreso quando funciona, como executar o ping do hostname ou hostname.local raramente resulta em sucesso, embora nada mude na minha rede há meses.
Cerin
11
Isso não é bem verdade. Embora você possa enviar seu nome de host para o servidor DHCP com o send host-name "example.com";objetivo de obter um endereço IP específico, você também pode solicitá -lo request host-name;.
Dmitry Grigoryev
1

Se encontrado, pode ser um erro de script do dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

Tente limpar $ old_host_name na renovação de ip

echo desmarcar old_host_name> /etc/dhcp/dhclient-enter-hooks.d/unset_old_hostname

Também estático / etc / hostname parece ter prioridade sobre a resposta dhcp, então deixe em branco

> / etc / nome do host

Testado no ubuntu 14.04 e no servidor dnsmasq.

Adão
fonte
1

Observe que, ao usar o Ubuntu 18.04, os scripts de conexão não são mais necessários. Se o nome do host da instalação estiver definido como localhostno /etc/hostnamecliente DHCP, ele será definido automaticamente na inicialização, usando o nome emitido pelo DHCP, se presente. Ao executá- hostnamectllo, ele será listado localhostcomo o nome do host permanente e quaisquer problemas de DHCP como um nome de host transitório.

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname
Justin Scott
fonte
0

A resposta depende se você está usando concessões estáticas ou não no servidor DHCP. Se você é, não é necessário obter o nome do host do DNS. Você pode alterar esta linha na solução de d_inevitable

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

para

hostname=${new_host_name}

Mas isso deve acontecer automaticamente se o nome do host estiver originalmente definido como localhost.localdomain, para que você não precise escrever um script. No entanto, se você deseja definir o nome do host para o FQDN, precisará alterar o script de d_inevitable para

hostname=${new_host_name}.${new_domain_name}

Novamente, tudo isso funciona apenas se você estiver usando concessões estáticas.

user248850
fonte
0

Não tenho reputação suficiente para comentar, mas eu gostaria de retroceder na resposta anterior, pois quase resolveu o problema para mim usando um gancho dhclient.

Descobri que, usando o servidor DHCP ISC padrão por algum motivo, o gancho mencionado acima gera um nome de host com um '.' caractere de ponto final no final do nome do host por algum motivo.

Portanto, na resposta anterior, você pode precisar "cortar" o período estranho com um sed:

hostname=$(host $new_ip_address | cut -d ' ' -f 5)

Se tornaria:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
Michael R. Hines
fonte