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