我正在尝试为OS X编写一个bash脚本,它将更改为当前连接添加名称服务器.我有更改DNS服务器的命令,但我需要保留当前的namesever.
我认为我可以从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命令中的参数?
解决方法
经过最低限度的测试;为了获得最佳效果,在每个[]中,在括号内添加一个选项卡:
networksetup -setdnsservers AirPort $(sed -ne 's/^[ ]*nameserver[ ]\+\([.:0-9A-Fa-f]\+\)/\1/p' /etc/resolv.conf)
sed表达式从以nameserver开头,后跟IPv4或IPv6地址的行中提取地址. $()构造将sed的输出插入到networksetup的命令行中.
如果/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