Назад | Перейти на главную страницу

Как добавить новый DNS-сервер через командную строку?

Я пытаюсь написать сценарий bash для OS X, который изменится, добавит сервер имен для текущего соединения. У меня есть команда для изменения 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

Есть ли способ использовать регулярное выражение для извлечения IP-адреса из resolv.conf, а затем как-то использовать его в качестве аргумента в команде networksetup?

Минимально проверено; для достижения наилучших результатов в каждом [ ], добавьте табуляцию в скобки:

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

Как насчет чего-то вроде этого:

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

Регулярное выражение, вероятно, можно улучшить.

Вместо того, чтобы читать /etc/resolv.conf, я бы использовал networksetup -getdnsservers чтобы получить текущий список. Единственная сложность заключается в том, что, если ни одного назначенного нет, он ответит: «В AirPort не установлены DNS-серверы», поэтому вы должны исключить это из результатов.

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