Como obter o nome do host de um servidor DHCP

14

Eu quero que o Ubuntu receba o nome do host e o nome DNS de um cliente DHCP . A instalação padrão do Ubuntu 11.10 (Oneiric Ocelot) não faz isso.

A mesma pergunta foi feita e não foi resolvida nos Fóruns do Ubuntu .

    
por Oguz Bilgic 17.02.2012 / 02:05

8 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/((.*)[^\.])\.?//g' )
echo $hostname > /etc/hostname
hostname $hostname
echo dhclient-exit-hooks.d/hostname: Dynamic Hostname = $hostname

Substitua eth0 e wlan0 pelos nomes das interfaces das quais você deseja obter o nome do host. Na maioria dos casos, eth0 e wlan0 devem permanecer os mesmos.

Certifique-se de que é legível ...

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

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

    
por d_inevitable 07.05.2013 / 23:15
4

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

link

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

    
por Dave Morris 10.01.2013 / 08:28
2

Você não consegue seu nome de host do servidor DHCP.

Você pode enviar seu hostname para o servidor, o que pode mudar o IP que você está atribuído. Você pode alterar o nome que é enviado editando a conexão do Gerenciador de Rede (o campo é chamado de ID do Cliente DHCP) ou pode editar (como root) /etc/dhcp/dhclient.conf . Procure a linha que diz:

send host-name "<hostname>";

... e altere <hostname> para o que você quiser.

Por padrão, o Ubuntu obterá suas configurações de DNS do roteador (se elas forem enviadas), mas suspeito que você esteja falando sobre ocal DNS / mDNS , onde você pode acessar outros computadores pelo nome do host. Isso é chamado de Ahavi ou Zeroconf no Ubuntu e é instalado por padrão.

Você deve conseguir acessar seu computador por <hostname>.local

    
por Oli 17.02.2012 / 02:23
2
A resposta de d_inevitable quase resolveu meu problema, mas não completamente. O problema foi que, embora:

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

    option host name 'client1' 
    

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

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

    request host-name 
    

    no dhclient.conf)

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

hostname

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

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

Primeiro, abra com o recurso 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()

Use apenas a pesquisa e ela deve aparecer. Agora, pelo menos no meu computador, essa função tem três condições if-then-else, encapsuladas entre si:

% bl0ck_qu0te%

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

% bl0ck_qu0te%

Agora, os d_inevitable's ou isso deve funcionar como esperado. Espero que ajude se você estiver em uma frustração tão desesperada quanto eu.

    
por George 08.02.2014 / 04:01
1

Se for encontrado, isso pode ser um bug de scripts do dhcpclient. link

Tente limpar o $ old_host_name no ip renew

% bl0ck_qu0te%

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

% bl0ck_qu0te%

Testado no ubuntu 14.04 e no servidor dnsmasq.

    
por Adam 30.04.2015 / 23:53
1

A resposta de Oli é demonstravelmente falsa ("Você não consegue seu nome de host do servidor DHCP"), como evidenciado pelas outras respostas aqui, e também pela minha recente experiência em um sistema RHEL7. Disse que o sistema obteve 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 APARECE APOIAR ISTO!

No entanto, o dhcpcd5 sai da caixa. Pare o dhclient, instale o dhcpcd5, execute o dhcpcd, renove sua concessão e poof, seu nome de host no seu cliente dhcp está configurado para o nome enviado do servidor DHCP. Nenhum script dhclient-exit-hooks.d, nenhum hack em 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 código bonito em rc.local para detectar quando a rede surgiu e forçar uma pesquisa (no meu caso) de / etc / hosts para obter o nome do host e depois executar 'hostname' com esse nome de host. Ele funciona, mas até que a rede apareça, seu nome de host provavelmente está errado (ao remover um host, eu removo o / etc / hostname, então o nome do host é 'localhost' até que eu possa rodar '/etc/init.d/hostname). sh start 'uma vez que a rede aparece - então, quando você recebe um novo nome, você precisa inicializar duas vezes - uma para obter seu nome de host e uma vez para ter esse nome disponível quando tudo é iniciado ...).

Nota lateral - Estou um pouco mais do que um pouco frustrado com as regras do fórum que dizem que não posso responder a uma resposta, mas posso postar uma nova resposta! O que leva 50 para saber o suficiente para responder a um post, mas qualquer idiota pode fazer um novo post? Ah bem. Então, estou fazendo uma postagem em vez de responder ...

    
por RustyCar 14.06.2018 / 22:08
0

A resposta depende de você estar ou não usando concessões estáticas em seu servidor DHCP. Se você for, não é necessário obter o nome do host do DNS. Você pode mudar essa linha na solução do d_inevitable

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

para

hostname=${new_host_name}

Mas isso deve acontecer automaticamente se o seu nome de host for originalmente definido como localhost.localdomain, para que você não precise escrever um script. No entanto, se você quiser definir o nome do host para o FQDN, será necessário alterar o script do d_inevitable para

hostname=${new_host_name}.${new_domain_name}

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

    
por user248850 16.02.2014 / 15:42
0

Não tenho reputação suficiente para comentar, mas gostaria de aproveitar a resposta anterior, pois quase resolvi o problema para mim usando um gancho dhclient.

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

Assim, na resposta anterior, talvez seja necessário "cortar" o período irrelevante 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")
    
por Michael R. Hines 04.01.2014 / 08:25