更改/ etc / network / interfaces后,如何让resolvconf重新生成resolv.conf?

使用与下面非常类似的更新/etc/network/interfaces ,如何更新/etc/resolv.conf ? 我尝试(以root身份) resolver -uservice networking restart但它们无法正常工作。 我还修复了resolv.conf的符号链接,并再次尝试了resolver -u 。 最后,我沮丧地重新启动,这确实通过重建/etc/resolv.conf解决问题。

Ubuntu 12.04,64位服务器,安装了所有最新补丁。

示例/etc/network/interfaces

 iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 gateway 192.168.3.1 dns-search example.com dns-nameservers 192.168.3.45 192.168.8.10 

service networking restart并不总是降低所有接口的可靠方式。

resolvconf -u命令仅从resolvconf自己的数据库更新resolv.conf 。 您需要更新数据库。

要更新数据库,必须使用-a-d选项调用resolvconf。 当你运行ifup或ifdown时,会发生这种情况。 因此,正常情况下,与/etc/network/interfaces任何其他更改一样,要激活对dns- *选项的更改,您必须ifdown关注相关接口并再次使用ifup。 或者你可以重启。

如果你想对接口进行更改而不降低它(可能是因为你远程管理机器并碰巧通过该接口连接,natch),那么你可以通过直接从命令行运行resolvconf来实现相同的结果。 这需要更多地了解resolvconf的语义。 假设相关的/ e / n / i节是

 iface IIII FFFF static address ... ... dns-nameservers XXXX YYYY dns-search SSSS 

其中FFFF是地址族(“inet”或“inet6”)。

要激活这些dns- *选项,请按如下方式运行resolvconf(是的,将字符串中的换行符传送给resolvconf)。

 echo "nameserver XXXX nameserver YYYY search SSSS" | sudo resolvconf -a IIII.FFFF 

对于问题中给出的节,这将是以下内容。

 echo "nameserver 192.168.3.45 nameserver 192.168.8.10 search example.com" | sudo resolvconf -a eth0.inet 

有关更多信息,请参阅resolvconf(8)手册页和resolvconf软件包自述文件(/usr/share/doc/resolvconf/README.gz)。

虽然默认情况下没有安装联机帮助页,但是通过更新脚本选项进行了记录,只需运行:

 sudo resolvconf -u 

对于那些远程管理服务器的人,您可以:

  1. 更新/etc/network/interfacesdns-nameservers
  2. # ifdown eth01; ifup eth01

请注意,这必须在一行上划分; (linux命令行分隔符)。 你甚至不应该失去当前的联系。 例外是在interfaces文件中输入拼写错误。 如果发生这种情况, ifup将失败,您将不得不进行物理访问或其他ethxx连接。

service resolvconf restart会重新生成/etc/resolv.conf文件而不用大惊小怪。

这个答案类似于上面的答案,但使用问题示例配置来回答问题。 此外,这解释了为什么两个命令都是必要

编辑/etc/network/interfaces

 iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 gateway 192.168.3.1 dns-search example.com dns-nameserver 192.168.3.45 dns-nameserver 192.168.8.10 

除非重新启动或重新加载配置文件,否则不会进行这些更改:

为了更新interfaces文件,必须运行以下命令:

 echo "nameserver 192.168.3.45 nameserver 192.168.8.10 search example.com" | sudo resolvconf -a eth0.inet 

这允许更新接口而无需重新启动或重新加载。

但是,如果未进行/etc/network/interfaces中的更改,则重新启动后上述命令更改将丢失。

顺便说一句,BDenis在这个列表中的最后一个答案实际上是通过解析/etc/network/interfaces文件来代替最后一个命令并将这些行sudo resolvconf -a eth0给命令sudo resolvconf -a eth0它实际上是答案的一半而且非常好内联sed解析的示例。 如果你想看看它是如何做的,只需运行命令的第一部分并观察它解析/etc/network/interfaces文件并吐出运行sudo resolvconf -a eth0命令所需的所有必要信息:

 sed 's/#.*$//' /etc/network/interfaces | grep dns- | sed 's/dns-//g' 

请注意,这将产生与命令相同的输出:

 echo "nameserver 192.168.3.45 nameserver 192.168.8.10 search example.com" 

前提是/etc/network/interfaces文件配置了以下信息:

 iface eth0 inet static address 192.168.3.3 netmask 255.255.255.0 gateway 192.168.3.1 dns-search example.com dns-nameserver 192.168.3.45 dns-nameserver 192.168.8.10 

简单回答:

只需安装resolvconf即可。 apt install resolvconf

之后, ifup eth0根据/etc/network/interfacesdns-nameservers行更新etc/resolv.conf中的dns-nameservers

这对我有用:

 sed -re '/nameservers|dns-search/ !d' -e 's/dns-nameservers/nameserver/' -e 's/dns-search/search/' /etc/network/interfaces | resolvconf -a eth0.inet && resolvconf -u 

相应调整。

在18.04,以下工作可靠(以root身份运行):

 systemctl stop networking ip address flush dev  # just to be safe systemctl start networking 

重要说明:确保已安装包resolvconf
它似乎不是默认的,如果没有它, /etc/network/interfaces中的某些(!)更改会被默默忽略(例如dns-* )。

您也可以尝试以下命令:

 cat /etc/network/interfaces |sed 's/#.*$//'|grep dns-|sed 's/dns-//g'|sudo resolvconf -a eth0.inet