Quero que o Ubuntu obtenha 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 .
Quero que o Ubuntu obtenha 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 .
Respostas:
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 eth0
e wlan0
pelos nomes das interfaces das quais você deseja obter o nome do host. Na maioria dos casos eth0
e wlan0
deve 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.
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"
A resposta de d_inevitable quase resolveu meu problema, mas não completamente. O problema era que, embora:
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
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.
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.d
scripts, 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.local
para detectar quando a rede surgiu e forçar uma (no meu caso) uma pesquisa /etc/hosts
para obter o nome do host e depois executar hostname
com 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 localhost
até eu poder executar /etc/init.d/hostname.sh start
uma 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 ...).
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
hostname
e domínio digitando hostname -d
. por isso é fqdn deve ser hostname.domain
send host-name "example.com";
objetivo de obter um endereço IP específico, você também pode solicitá -lo request host-name;
.
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.
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 localhost
no /etc/hostname
cliente DHCP, ele será definido automaticamente na inicialização, usando o nome emitido pelo DHCP, se presente. Ao executá- hostnamectl
lo, ele será listado localhost
como 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
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.
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")
host
comando) 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 )