如何从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
将eth0
和wlan0
替换为要从中获取主机名的接口的名称。 在大多数情况下, eth0
和wlan0
应该保持不变。
确保它是可读的……
chmod a+r /etc/dhcp/dhclient-exit-hooks.d/hostname
就这样。 在下一个dhcp响应中,您的主机名将自动更新。
您没有从DHCP服务器获取主机名。
您可以将主机名发送到服务器,这可能会更改您分配的IP。 您可以通过编辑网络管理器连接(该字段称为DHCP客户端ID)更改要发送的名称,也可以编辑(以root用户身份) /etc/dhcp/dhclient.conf
。 寻找说:
send host-name "";
…并将
更改为您喜欢的任何内容。
默认情况下,Ubuntu将从路由器获取其DNS设置(如果它发送它们),但我怀疑你在谈论l DNS DNS / mDNS ,你可以通过它们的主机名访问其他计算机。 这在Ubuntu中称为Ahavi或Zeroconf,它默认安装。
您应该能够通过
访问您的计算机
d_inevitable的答案几乎解决了我的问题,但并非完全解决了。 问题是虽然:
-
DHCP服务器正在发送主机名(通过添加
option host name 'client1'
在dhcpd.conf中我实际通过使用wireshark捕获和分析DHCP提供的内容来validation它
-
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")