Comment obtenir le nom d'hôte d'un serveur DHCP


Réponses:


6

Il existe un moyen de le faire avec un petit script pour un hook dhcp comme décrit ici .

Créez un nouveau fichier:

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

et collez le code suivant:

#!/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

Remplacez eth0et wlan0par les noms des interfaces à partir desquelles vous souhaitez obtenir le nom d'hôte. Dans la plupart des cas eth0et wlan0devrait rester le même.

Assurez-vous qu'il est lisible ...

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

C'est tout. Lors de la prochaine réponse DHCP, votre nom d'hôte sera mis à jour automatiquement.


ce script utilise en fait une requête DNS (à l'aide de la hostcommande) pour extraire le nom d'hôte associé à l'adresse IP attribuée. Les serveurs DHCP peuvent en fait définir explicitement une option de nom d'hôte (option 12), qui peut potentiellement être différente du nom d'hôte que vous obtenez à partir d'une requête DNS sur l'IP (cela pourrait également échouer, si aucun enregistrement PTR pour l'IP n'existe sur le DNS )
Ale


3

La réponse de d_inevitable a presque résolu mon problème, mais pas complètement. Le problème était que bien que:

  1. Le serveur DHCP envoyait un nom d'hôte (en ajoutant le

    option host name 'client1' 
    

    dans le fichier dhcpd.conf) et je l'ai vérifié en capturant et en analysant le contenu de l'offre DHCP avec wirehark

  2. Le client DHCP attendait le nom d'hôte du serveur DHCP (en ajoutant

    request host-name 
    

    dans le dhclient.conf)

Le client n'obtenait pas de nouveau nom d'hôte (facilement vérifié en tapant

hostname

dans le terminal et obtenir l'ancien nom d'hôte, ou pas de nom d'hôte si j'avais supprimé le contenu / fichier). En conséquence, la solution proposée par d_inevitable ne copiait qu'une chaîne vide.

Pour résoudre cela, j'ai appliqué une solution crud, qui ne devrait généralement pas être suivie sauf si vous êtes désespéré de le faire fonctionner, comme moi.

Tout d'abord, ouvrez avec une capacité d'édition le script de contrôle client DHCP:

sudo vi /sbin/dhclient-script

Là, vous devrez localiser la fonction

set_hostname()

Utilisez simplement la recherche et elle devrait apparaître. Maintenant, au moins sur mon ordinateur, cette fonction a trois conditions if-then-else, encapsulées les unes aux autres:

# 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 }

Maintenant, ce dont vous avez besoin est de forcer l'attribution du nouveau nom d'hôte à votre hôte, quoi qu'il arrive. Par conséquent, vous voulez commenter les deux if-then-else encapsulés. Le résultat devrait ressembler à quelque chose comme:

# 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 }

Maintenant, le d_inevitable ou cela devrait fonctionner comme prévu. J'espère que cela vous aidera si vous êtes dans une frustration désespérée similaire à la mienne.


3

La réponse d'Oli est manifestement fausse ("Vous ne recevez pas votre nom d'hôte du serveur DHCP"), comme en témoignent les autres réponses ici, et aussi par ma récente expérience sur un système RHEL7. Ledit système a obtenu son nom d'hôte du serveur DHCP.

Et, en effet, il y a des choses dans les fichiers de configuration DHCP qui sont censées y arriver. Par exemple:

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

Est censé dire à cet hôte que son nom est host4.

En fin de compte, le client d'isc n'apparaît pas pour soutenir cela!

Cependant, dhcpcd5 le fait, hors de la boîte. Arrêtez dhclient, installez dhcpcd5, exécutez dhcpcd, renouvelez votre bail et pouf, votre nom d'hôte sur votre client DHCP est défini sur le nom envoyé par le serveur DHCP. Pas de dhclient-exit-hooks.dscript, pas de piratagerc.local , rien.

En conclusion, j'ai passé beaucoup de temps à essayer de faire fonctionner cela en utilisant dhclient d'ISC. Absolument aucune joie, même lorsque le serveur envoie le nom d'hôte.

Ma solution initiale au problème a été d'écrire du code mignon rc.localpour détecter le moment où le réseau est apparu et forcer une recherche (dans mon cas) /etc/hostspour obtenir le nom d'hôte, puis s'exécuter hostnameavec ce nom d'hôte. Cela fonctionne, mais jusqu'à ce que le réseau apparaisse, votre nom d'hôte est probablement faux (lors du premier déploiement d'un hôte, je le supprime /etc/hostname, donc le nom d'hôte est localhostjusqu'à ce que je puisse exécuter /etc/init.d/hostname.sh startune fois le réseau activé - donc lors de la première obtention d'un nouveau nom, vous devez démarrer deux fois - une fois pour obtenir votre nom d'hôte, et une fois pour avoir ce nom disponible lorsque tout démarre ...).


1

Vous n'obtenez pas votre nom d'hôte du serveur DHCP.

Vous pouvez envoyer votre nom d'hôte au serveur, ce qui peut changer l'adresse IP qui vous est attribuée. Vous pouvez modifier le nom envoyé en modifiant votre connexion Network Manager (le champ est appelé ID client DHCP) ou vous pouvez le modifier (en tant que root) /etc/dhcp/dhclient.conf. Recherchez la ligne qui dit:

send host-name "<hostname>";

... et changez <hostname>comme vous voulez.


Par défaut, Ubuntu obtiendra ses paramètres DNS du routeur (s'il les envoie), mais je pense que vous parlez de DNS / mDNS local où vous pouvez accéder à d'autres ordinateurs par leur nom d'hôte. Cela s'appelle Ahavi ou Zeroconf dans Ubuntu et il est installé par défaut.

Vous devriez pouvoir accéder à votre ordinateur en <hostname>.local


J'ai le DNS et le serveur DHCP (Windows 2008) sur mon réseau. Ant, il attribue le nom d'hôte et le nom DNS à chaque adresse IP, mais Ubuntu ne met pas à jour son nom d'hôte et son nom DNS. Je devrais être en mesure de voir ce nom d'hôte attribué en tapant hostnameet domaine en tapant hostname -d. il est donc fqdn devrait être hostname.domain
Oguz Bilgic

AFAIR si le client n'est pas joint au domaine Windows, le serveur DHCP Windows ne mettra pas à jour dynamiquement les entrées DNS Windows. Je ne suis pas vraiment sûr cependant ... dépend de la configuration DHCP / DNS de Windows
oddfellow

Par défaut, 12.04 a cette ligne "send host-name = gethostname ();" et vous pouvez voir cette valeur en tapant "hostname" sur la ligne de commande. Par défaut, cela n'aura aucun effet sur un réseau Windows. Selon la question d'origine.
Móż

Bien que zeroconf soit installé par défaut, il est horriblement peu fiable. Je suis franchement surpris quand cela fonctionne, car cingler hostname ou hostname.local aboutit rarement au succès même si rien n'a changé sur mon réseau en quelques mois.
Cerin

1
Ce n'est pas tout à fait vrai. Bien que vous puissiez envoyer votre nom d'hôte au serveur DHCP avec send host-name "example.com";afin d'obtenir une adresse IP spécifique, vous pouvez tout aussi bien en demander une avec request host-name;.
Dmitry Grigoryev

1

S'il est trouvé, cela peut être un bogue de scripts dhcpclient. http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

Essayez de nettoyer $ old_host_name lors du renouvellement de l'IP

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

Aussi, / etc / hostname statique semble avoir la priorité sur la réponse DHCP alors laissez-le vide

> / etc / hostname

Testé sur ubuntu 14.04 et serveur dnsmasq.


1

Notez que lorsque vous utilisez Ubuntu 18.04, les scripts de connexion ne sont plus nécessaires. Si le nom d'hôte de l'installation est défini sur localhostdans /etc/hostnamele client DHCP, le nom d'hôte sera défini automatiquement au démarrage en utilisant le nom émis par DHCP, s'il est présent. Lors de son exécution, hostnamectlil sera répertorié localhostcomme nom d'hôte permanent et tous les problèmes DHCP comme nom d'hôte transitoire.

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

0

La réponse dépend de l'utilisation ou non de baux statiques sur votre serveur DHCP. Si vous l'êtes, il n'est pas nécessaire d'obtenir le nom d'hôte du DNS. Vous pouvez changer cette ligne dans la solution de d_inevitable

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

à

hostname=${new_host_name}

Mais cela devrait se produire automatiquement si votre nom d'hôte est initialement défini sur localhost.localdomain, vous n'avez donc pas à écrire de script. Cependant, si vous souhaitez définir le nom d'hôte sur le FQDN, vous devrez changer le script de d_inevitable en

hostname=${new_host_name}.${new_domain_name}

Encore une fois, tout cela ne fonctionne que si vous utilisez des baux statiques.


0

Je n'ai pas assez de réputation pour commenter, mais je voudrais me baser sur la réponse précédente car cela a presque résolu le problème pour moi en utilisant un crochet dhclient.

J'ai trouvé qu'en utilisant le serveur DHCP ISC standard pour une raison quelconque, le crochet susmentionné génère un nom d'hôte avec un '.' caractère de période à la fin du nom d'hôte pour une raison quelconque.

Donc, dans la réponse précédente, vous pourriez avoir besoin de "couper" la période étrangère avec un sed:

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

Deviendrait:

hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.