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

如何通过命令行附加新的 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

有没有办法使用正则表达式从 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

相关内容