Cómo obtener el nombre de host de un servidor DHCP


Respuestas:


6

Hay una manera de hacerlo con un pequeño script para un gancho dhcp como se describe aquí .

Crea un nuevo archivo:

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

y pegue el siguiente 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

Reemplace eth0y wlan0con los nombres de las interfaces de las que desea obtener el nombre de host. En la mayoría de los casos eth0y wlan0debe permanecer igual.

Asegúrese de que sea legible ...

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

Eso es todo. En la siguiente respuesta dhcp, su nombre de host se actualizará automáticamente.


Este script en realidad usa una consulta DNS (usando el hostcomando) para extraer el nombre de host asociado con la dirección IP asignada. Los servidores DHCP pueden establecer explícitamente una opción de nombre de host (opción 12), que puede ser potencialmente diferente del nombre de host que obtiene de una consulta DNS en la IP (esto también podría fallar, si no existe un registro PTR para la IP en el DNS )
Ale


3

La respuesta de d_inevitable casi resolvió mi problema, pero no completamente. El problema fue que aunque:

  1. El servidor DHCP estaba enviando un nombre de host (agregando el

    option host name 'client1' 
    

    en dhcpd.conf) y en realidad lo verifiqué capturando y analizando los contenidos de la oferta de DHCP con wireshark

  2. El cliente DHCP esperaba el nombre de host del servidor DHCP (agregando

    request host-name 
    

    en el dhclient.conf)

El cliente no estaba recibiendo un nuevo nombre de host (se verificaba fácilmente escribiendo

hostname

en terminal y obteniendo el antiguo nombre de host, o sin nombre de host si hubiera eliminado el contenido / archivo). Como resultado, la solución propuesta por d_inevitable solo estaba copiando una cadena vacía.

Para resolver eso, apliqué una solución cruda, que generalmente no debe seguirse a menos que esté desesperado por hacerlo funcionar, como lo estaba yo.

Primero, abra con capacidad de edición el script de control de cliente DHCP:

sudo vi /sbin/dhclient-script

Allí, deberás ubicar la función

set_hostname()

Simplemente use la búsqueda y debería aparecer de inmediato. Ahora, al menos en mi computadora, esta función tiene tres condiciones if-then-else, encapsuladas entre sí:

# set host name 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 }

Ahora, lo que necesita es forzar la asignación del nuevo nombre de host a su host, pase lo que pase. Por lo tanto, desea comentar los dos encapsulados if-then-else. El resultado debería ser similar a:

# set host name 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 }

Ahora el d_inevitable o esto debería funcionar como se esperaba. Espero que ayude si estás en una frustración desesperada similar a la mía.


3

La respuesta de Oli es demostrablemente falsa ("No obtiene su nombre de host del servidor DHCP"), como lo demuestran las otras respuestas aquí, y también por mi experiencia reciente en un sistema RHEL7. Dicho sistema obtuvo su nombre de host del servidor DHCP.

Y, de hecho, hay cosas en los archivos de configuración de DHCP que se supone que lo hacen posible. Por ejemplo:

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

Se supone que debe decirle a ese host que su nombre es host4.

¡Resulta que el cliente de ISC NO APARECE PARA APOYAR ESTO!

Sin embargo, dhcpcd5 lo hace, fuera de la caja. Detenga dhclient, instale dhcpcd5, ejecute dhcpcd, renueve su contrato de arrendamiento y, su nombre de host en su cliente DHCP está configurado con el nombre enviado desde el servidor DHCP. Sin dhclient-exit-hooks.dsecuencias de comandos, sin hacks rc.local, nada.

Como nota final, he pasado mucho tiempo tratando de hacer que esto funcione usando dhclient de ISC. Absolutamente nada de alegría, incluso cuando el servidor envía el nombre del host.

Mi solución inicial al problema fue escribir un código lindo rc.localpara detectar cuándo surgió la red y forzar una búsqueda (en mi caso) /etc/hostspara obtener el nombre de host y luego ejecutarlo hostnamecon ese nombre de host. Funciona, pero hasta que aparezca la red, su nombre de host probablemente sea incorrecto (cuando despliegue un host por primera vez, lo elimino /etc/hostname, por lo que el nombre del host es localhosthasta que pueda ejecutar /etc/init.d/hostname.sh startuna vez que la red aparece, por lo que al obtener un nuevo nombre debe iniciar dos veces: una vez para obtener su nombre de host, y una vez para tener ese nombre disponible cuando todo se inicia ...).


1

No obtiene su nombre de host del servidor DHCP.

Puede enviar su nombre de host al servidor, lo que puede cambiar la IP que le fue asignada. Puede cambiar el nombre que se envía editando su conexión de Network Manager (el campo se llama DHCP Client ID) o puede editar (como root) /etc/dhcp/dhclient.conf. Busque la línea que dice:

send host-name "<hostname>";

... y cambia <hostname>a lo que quieras.


Por defecto, Ubuntu obtendrá su configuración de DNS del enrutador (si los envía), pero sospecho que está hablando de DNS / mDNS locales donde puede acceder a otras computadoras por su nombre de host. Esto se llama Ahavi o Zeroconf en Ubuntu y se instala por defecto.

Debería poder acceder a su computadora <hostname>.local


Tengo el servidor dns y dhcp (Windows 2008) en mi red. Ant asigna nombre de host y nombre dns a cada ip, pero ubuntu no actualiza su nombre de host y nombre dns. Debería poder ver este nombre de host asignado escribiendo hostnamey dominio escribiendo hostname -d. entonces fqdn debería ser hostname.domain
Oguz Bilgic

AFAIR si el cliente no está unido al dominio de Windows, el servidor DHCP de Windows no actualizará dinámicamente las entradas DNS de Windows. Sin embargo, no estoy realmente seguro ... depende de la configuración de DHCP / DNS de Windows
oddfellow

Por defecto 12.04 tiene esta línea "enviar nombre de host = gethostname ();" y puede ver ese valor escribiendo "hostname" en la línea de comando. Por defecto, esto no tendrá ningún efecto en una red de Windows. Según la pregunta original.
Más

Aunque zeroconf está instalado de manera predeterminada, es terriblemente poco confiable. Estoy francamente sorprendido cuando funciona, ya que hacer ping al nombre de host o hostname.local rara vez resulta en éxito a pesar de que nada ha cambiado en mi red en meses.
Cerin

1
Esto no es completamente cierto. Si bien puede enviar su nombre de host al servidor DHCP con el send host-name "example.com";fin de obtener una dirección IP específica, también puede solicitar una request host-name;.
Dmitry Grigoryev


1

Tenga en cuenta que cuando se usa Ubuntu 18.04, las secuencias de comandos vinculadas ya no son necesarias. Si el nombre de host de la instalación está configurado localhosten /etc/hostnameel cliente DHCP, se establecerá el nombre de host automáticamente al inicio utilizando el nombre emitido por DHCP, si está presente. Cuando se ejecute hostnamectl, aparecerá localhostcomo el nombre de host permanente, y cualquier cosa que DHCP emita como un nombre de host transitorio.

testaccount@dhcp-hostname:~$ hostnamectl
   Static hostname: localhost
Transient hostname: dhcp-hostname

0

La respuesta depende de si está utilizando o no arrendamientos estáticos en su servidor DHCP. Si es así, no es necesario obtener el nombre de host del DNS. Puedes cambiar esta línea en la solución de d_inevitable

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

a

hostname=${new_host_name}

Pero esto debería suceder automáticamente si su nombre de host está configurado originalmente en localhost.localdomain, por lo que no tiene que escribir un script. Sin embargo, si desea establecer el nombre de host en el FQDN, deberá cambiar el script de d_inevitable a

hostname=${new_host_name}.${new_domain_name}

Nuevamente, todo esto solo funciona si está utilizando arrendamientos estáticos.


0

No tengo suficiente reputación para comentar, pero me gustaría aprovechar la respuesta anterior, ya que casi me solucionó el problema usando un gancho dhclient.

Descubrí que al usar el servidor DHCP ISC estándar por alguna razón, el enlace mencionado anteriormente genera un nombre de host con un '.' carácter de punto al final del nombre de host por algún motivo.

Entonces, en la respuesta anterior, es posible que necesite "cortar" el período extraño con un sed:

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

Se convertiría:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.