Je veux qu'Ubuntu obtienne le nom d'hôte et le nom DNS d'un client DHCP . L'installation par défaut d' Ubuntu 11.10 (Oneiric Ocelot) ne fait pas cela.
La même question a été posée et n'est pas résolue sur les forums Ubuntu .
Je veux qu'Ubuntu obtienne le nom d'hôte et le nom DNS d'un client DHCP . L'installation par défaut d' Ubuntu 11.10 (Oneiric Ocelot) ne fait pas cela.
La même question a été posée et n'est pas résolue sur les forums Ubuntu .
Réponses:
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 eth0
et wlan0
par les noms des interfaces à partir desquelles vous souhaitez obtenir le nom d'hôte. Dans la plupart des cas eth0
et wlan0
devrait 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.
Vous pouvez obtenir votre nom d'hôte depuis votre serveur DHCP - cela fait partie de la spécification DHCP.
https://tools.ietf.org/html/rfc1533#section-3.14
"Cette option spécifie le nom du client"
La réponse de d_inevitable a presque résolu mon problème, mais pas complètement. Le problème était que bien que:
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
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.
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.d
script, 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.local
pour détecter le moment où le réseau est apparu et forcer une recherche (dans mon cas) /etc/hosts
pour obtenir le nom d'hôte, puis s'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 faux (lors du premier déploiement d'un hôte, je le supprime /etc/hostname
, donc le nom d'hôte est localhost
jusqu'à ce que je puisse exécuter /etc/init.d/hostname.sh start
une 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 ...).
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
hostname
et domaine en tapant hostname -d
. il est donc fqdn devrait être hostname.domain
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;
.
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.
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 localhost
dans /etc/hostname
le 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, hostnamectl
il sera répertorié localhost
comme 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
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.
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")
host
commande) 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 )