Я пытаюсь написать сценарий 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