如何通过命令行追加新的DNS服务器?

我想写一个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 

有没有办法使用正则expression式从resolv.conf中提取IP,然后以某种方式将它用作networksetup命令中的参数?

最小testing; 为了获得最佳效果,在每个[ ] ,在括号内添加一个选项卡:

 networksetup -setdnsservers AirPort $(sed -ne 's/^[ ]*nameserver[ ]\+\([.:0-9A-Fa-f]\+\)/\1/p' /etc/resolv.conf) 

sedexpression式从以nameserver字首开头的行开始,后跟IPv4或IPv6地址。 $()构造将sed的输出内插到networksetup的命令行上。

如果有可能在/etc/resolv.conf没有任何nameserver行,这里有一个相对简单的方法:

 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 

怎么样这样的事情:

 networksetup -setdnsservers Airport `grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /etc/resolv.conf` 

正则expression式可能可以改进。

而不是阅读/etc/resolv.conf,我会使用networksetup -getdnsservers获取当前列表。 只有复杂的是,如果没有任何分配,它会回复“有没有在AirPort上设置任何DNS服务器”,所以你必须从结果中排除。

 networksetup -setdnsservers "AirPort" $(networksetup -getdnsservers "AirPort" | egrep "^[.:0-9A-Fa-f]+$") 8.8.8.8