![如何通过命令行附加新的 DNS 服务器?](https://linux22.com/image/521532/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E9%99%84%E5%8A%A0%E6%96%B0%E7%9A%84%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
我正在尝试为 OS X 编写一个 bash 脚本,该脚本将更改并将为当前连接添加名称服务器。我已收到更改 DNS 服务器的命令,但我需要保留当前的名称服务器。
我的想法是,我可以从 resolv.conf 文件中获取当前名称服务器,然后在命令中以某种方式使用它。
我目前已将名称服务器更改为 8.8.8.8:
networksetup -setdnsservers AirPort 8.8.8.8
我需要做的是从 /etc/resolv.conf 检测当前名称服务器,然后将该值用作上述命令中的参数。例如,我当前的 resolv.conf 如下所示:
nameserver 9.9.9.9
我想要上面的命令来执行此操作:
networksetup -setdnsservers AirPort 9.9.9.9, 8.8.8.8
有没有办法使用正则表达式从 resolv.conf 中提取 IP,然后以某种方式将其用作 networksetup 命令中的参数?
答案1
经过最低限度的测试;为了获得最佳效果,在每个[ ]
括号内添加一个制表符:
networksetup -setdnsservers AirPort $(sed -ne 's/^[ ]*nameserver[ ]\+\([.:0-9A-Fa-f]\+\)/\1/p' /etc/resolv.conf)
该sed
表达式从以 开头的行中提取地址,nameserver
后跟 IPv4 或 IPv6 地址。该$()
构造将 的输出插入sed
到 的命令行上networksetup
。
如果有可能没有任何nameserver
一行/etc/resolv.conf
,这里有一个相对简单的方法:
nameservers=$(sed -ne 's/^[ ]*nameserver[ ]\+\([.:0-9A-Fa-f]\+\)/\1/p' /etc/resolv.conf)
if [ -z "$nameservers" ]; then nameservers=empty; fi
networksetup -setdnsservers AirPort $nameservers
答案2
那么像这样的事情怎么样:
networksetup -setdnsservers Airport `grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /etc/resolv.conf`
正则表达式可能需要改进。
答案3
与其读取 /etc/resolv.conf,我不如使用它networksetup -getdnsservers
来获取当前列表。唯一的麻烦是,如果没有分配任何 DNS 服务器,它会回复“AirPort 上没有设置任何 DNS 服务器”,因此您必须将其从结果中排除。
networksetup -setdnsservers "AirPort" $(networksetup -getdnsservers "AirPort" | egrep "^[.:0-9A-Fa-f]+$") 8.8.8.8