web-dev-qa-db-fra.com

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

Je veux qu'Ubuntu obtienne le nom d'hôte et le nom DNS d'un client DHCP . L'installation par défaut de buntu 11.1 (Oneiric Ocelot) ne fait pas cela.

La même question a été posée et n'est pas résolue sur Forums Ubuntu .

16
Oguz Bilgic

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

Créer 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 eth0 et wlan0 par les noms des interfaces à partir desquelles vous voulez obtenir le nom d’hôte. Dans la plupart des cas, eth0 et wlan0 devraient rester les mêmes.

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.

6
d_inevitable

Vous pouvez obtenir votre nom d'hôte à partir de votre serveur DHCP - il fait partie de la spécification DHCP.

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

"Cette option spécifie le nom du client"

4
Dave Morris

La réponse de Oli est manifestement fausse ("vous ne recevez pas votre nom d'hôte du serveur DHCP"), comme en témoignent les autres réponses fournies ici, ainsi que ma récente expérience sur un système RHEL7. Ce système tire son nom d'hôte du serveur DHCP.

Et, en effet, il y a des choses dans les fichiers de configuration DHCP qui sont supposées rendre cela possible. 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 qu'il s'appelle Host4.

Il se trouve que le client d’isc ne semble pas l’aider!

Cependant, dhcpcd5 est prêt à l'emploi. Arrêtez dhclient, installez dhcpcd5, exécutez dhcpcd, renouvelez votre bail et poof, votre nom d’hôte sur votre client DHCP est défini sur le nom envoyé par le serveur DHCP. Pas de script dhclient-exit-hooks.d, pas de hacks dans rc.local, rien.

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

Ma solution initiale au problème consistait à écrire du code mignon dans rc.local pour détecter le moment où le réseau était installé et à forcer une recherche (dans mon cas) de /etc/hosts pour obtenir le nom d’hôte, puis à exécuter hostname avec ce nom d’hôte. Cela fonctionne, mais jusqu'à ce que le réseau apparaisse, votre nom d'hôte est probablement incorrect (lors du premier déploiement d'un hôte, je supprime /etc/hostname, de sorte que le nom d'hôte est localhost jusqu'à ce que je puisse exécuter /etc/init.d/hostname.sh start une fois que le réseau est installé. besoin de 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 ...).

3
RustyCar

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 j’ai effectivement vérifié en capturant et en analysant le contenu de l’offre DHCP avec wireshark

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

    request Host-name 
    

    dans le fichier dhclient.conf)

le client n'a pas obtenu un nouveau nom d'hôte (facilement vérifié en tapant

hostname

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

Pour résoudre ce problème, j'ai appliqué une solution crud qui ne devrait généralement pas être suivie à moins que vous ne souhaitiez le faire fonctionner comme je le faisais.

Tout d’abord, ouvrez le script de contrôle du client DHCP avec la possibilité d’édition:

Sudo vi /sbin/dhclient-script

Là, vous devrez localiser la fonction

set_hostname()

Il suffit d’utiliser la recherche et cela devrait arriver. Maintenant, au moins sur mon ordinateur, cette fonction a trois conditions if-then-else, encapsulées entre elles:

# set Nom d'hôte 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, vous devez forcer l’attribution du nouveau nom d’hôte à votre hôte, quoi qu’il en soit. Par conséquent, vous voulez commenter les deux encapsulés if-then-else. Le résultat devrait ressembler à quelque chose comme:

# set Nom d'hôte 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 this devrait fonctionner comme prévu. J'espère que cela vous aidera si vous ressentez la même frustration désespérée que moi.

3
George

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

Essayez de nettoyer $ old_Host_name sur ip renew

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

De plus, statique/etc/hostname semble avoir la priorité sur la réponse DHCP donc laissez-le vide

>/etc/hostname

Testé sur Ubuntu 14.04 et le serveur Dnsmasq.

1
Adam

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 modifier l'adresse IP qui vous est attribuée. Vous pouvez modifier le nom envoyé en modifiant votre connexion à Network Manager (le champ s'appelle ID client DHCP) ou vous pouvez éditer (en tant que racine) /etc/dhcp/dhclient.conf. Recherchez la ligne qui dit:

send Host-name "<hostname>";

... et remplacez <hostname> par tout ce que vous voulez.


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

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

1
Oli

La réponse dépend si vous utilisez ou non des baux statiques sur votre serveur DHCP. Si vous l'êtes, il est inutile d'obtenir le nom d'hôte auprès de 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 défini à l'origine sur localhost.localdomain. Vous n'avez donc pas besoin d'écrire de script. Toutefois, si vous souhaitez définir le nom d’hôte sur le nom de domaine complet, vous devez modifier 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
user248850

Vous n’avez pas assez de réputation pour commenter, mais j’aimerais revenir sur la réponse précédente, car elle a presque résolu le problème en utilisant un crochet client.

J'ai constaté que, pour une raison quelconque, en utilisant le serveur DHCP ISC standard, le hook susmentionné génère un nom d'hôte avec un '.' le caractère point à 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 superflue 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")
0
Michael R. Hines