如何从DHCP服务器获取主机名

我希望Ubuntu从DHCP客户端获取主机名和DNS名称。 Ubuntu 11.10 (Oneiric Ocelot)的默认安装不会这样做。

Ubuntu论坛上提出了同样的问题并且没有解决 。

有一种方法可以使用这里描述的dhcp钩子的小脚本来完成它。

创建一个新文件:

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

并粘贴以下代码:

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

eth0wlan0替换为要从中获取主机名的接口的名称。 在大多数情况下, eth0wlan0应该保持不变。

确保它是可读的……

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

就这样。 在下一个dhcp响应中,您的主机名将自动更新。

可以从DHCP服务器获取主机名 – 它是DHCP规范的一部分。

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

“此选项指定客户端的名称”

您没有从DHCP服务器获取主机名。

您可以主机名发送到服务器,这可能会更改您分配的IP。 您可以通过编辑网络管理器连接(该字段称为DHCP客户端ID)更改要发送的名称,也可以编辑(以root用户身份) /etc/dhcp/dhclient.conf 。 寻找说:

 send host-name ""; 

…并将更改为您喜欢的任何内容。


默认情况下,Ubuntu将从路由器获取其DNS设置(如果它发送它们),但我怀疑你在谈论l DNS DNS / mDNS ,你可以通过它们的主机名访问其他计算机。 这在Ubuntu中称为Ahavi或Zeroconf,它默认安装。

您应该能够通过.local访问您的计算机

d_inevitable的答案几乎解决了我的问题,但并非完全解决了。 问题是虽然:

  1. DHCP服务器正在发送主机名(通过添加

     option host name 'client1' 

    在dhcpd.conf中我实际通过使用wireshark捕获和分析DHCP提供的内容来validation它

  2. DHCP客户端期望来自DHCP服务器的主机名(通过添加

     request host-name 

    在dhclient.conf中)

客户端没有获得新的主机名(通过键入很容易validation)

 hostname 

在终端并获取旧主机名,如果我删除了内容/文件,则没有主机名)。 因此,d_inevitable提出的解决方案只是复制一个空字符串。

为了解决这个问题,我采用了一种通常不应该遵循的解决方案,除非你不顾一切地想让它工作,就像我一样。

首先,使用编辑function打开DHCP客户端控制脚本:

 sudo vi /sbin/dhclient-script 

在那里,你将不得不找到该function

 set_hostname() 

只需使用搜索,它应该会出现。 现在,至少在我的计算机上,这个函数有三个if-then-else条件,相互封装:

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

现在,您需要的是强制将新主机名分配给您的主机,无论如何。 因此,您想要注释掉两个封装的if-then-else。 结果应该类似于:

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

现在d_inevitable或者这应该按预期工作。 希望如果你像我一样处于类似的绝望挫折中会有所帮助。

如果发现可能是dhcpclient脚本的bug。 http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html

尝试在ip续订时清除$ old_host_name

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

静态/ etc / hostname似乎也比dhcp answer更具优势,所以请将其留空

> / etc / hostname

在ubuntu 14.04和dnsmasq服务器上测试。

Oli的答案显然是错误的(“你没有从DHCP服务器获取你的主机名”),正如这里的其他答案以及我最近在RHEL7系统上的经验所certificate的那样。 所述系统从dhcp服务器获得其主机名。

事实上,dhcp配置文件中有些东西应该可以实现。 例如:

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

应该告诉主持人他的名字是host4。

事实certificate,isc的dhclient并不支持这个!

但是,dhcpcd5开箱即用。 停止dhclient,安装dhcpcd5,运行dhcpcd,续订租约,poof,你的dhcp客户端上的主机名设置为从DHCP服务器发送的名称。 没有dhclient-exit-hooks.d脚本,没有rc.local的黑客,没有。

作为最后一点,我花了很多时间尝试使用ISC的dhclient来实现这一点。 即使服务器发送主机名,也绝对没有乐趣。

我对该问题的初步解决方案是在rc.local中编写一些可爱的代码,以检测网络何时出现并强制(在我的情况下)搜索/ etc / hosts以获取主机名,然后使用该主机名运行“hostname” 。 它可以工作,但是在网络出现之前你的主机名可能是错的(首次部署主机时,我删除/ etc / hostname,所以主机名是’localhost’,直到我可以运行’/etc/init.d/hostname。 sh start’一旦网络启动 – 所以当第一次获得一个新名称时,你需要启动两次 – 一次获取你的主机名,一次在一切启动时都有这个名字……)。

旁注 – 我对论坛规则感到有点沮丧,说我不能回答答案,但我可以发布一个全新的’答案’! 什么,知道足够回答post需要50,但任何白痴都可以发新post? 那好吧。 所以,我正在发帖而不是回复……

答案取决于您是否在DHCP服务器上使用静态租约。 如果是,则无需从DNS获取主机名。 您可以在d_inevitable的解决方案中更改此行

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

 hostname=${new_host_name} 

但是,如果您的主机名最初设置为localhost.localdomain,则应自动执行此操作,因此您不必编写脚本。 但是,如果要将主机名设置为FQDN,则需要将d_inevitable的脚本更改为

 hostname=${new_host_name}.${new_domain_name} 

同样,所有这些只有在您使用静态租约时才有效。

没有足够的声誉来评论,但我想捎带前面的答案,因为它几乎解决了我使用dhclient钩子的问题。

我发现由于某种原因使用标准的ISC DHCP服务器,前面提到的钩子输出一个带有’。’的主机名。 由于某种原因,主机名末尾的句点字符。

因此,在上一个答案中,您可能需要使用sed“删除”无关期间:

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

会成为:

 hostname=$(host $new_ip_address | cut -d ' ' -f 5 | sed -e "s/\.$//g")