Como anexar novo servidor DNS via linha de comando?

4

Eu estou tentando escrever um script bash para o OS X que irá mudar irá adicionar um servidor de nomes para a conexão atual. Eu tenho o comando para alterar os servidores DNS, mas preciso preservar os nomes atuais.

O que eu pensei é que eu poderia pegar o nameserver atual do arquivo resolv.conf e usar isso de alguma forma no comando.

Atualmente, tenho isso para alterar o servidor de nomes para 8.8.8.8:

networksetup -setdnsservers AirPort 8.8.8.8

O que eu preciso fazer é detectar o servidor de nomes atual do /etc/resolv.conf e depois usar o valor como um parâmetro no comando acima. Por exemplo, digamos que meu resolv.conf atual seja assim:

nameserver 9.9.9.9

Eu quero o comando acima para fazer isso:

networksetup -setdnsservers AirPort 9.9.9.9, 8.8.8.8

Existe uma maneira de usar a expressão regular para extrair o IP do resolv.conf e, de alguma forma, usar isso como um argumento no comando networksetup?

    
por Camsoft 14.08.2010 / 23:27

3 respostas

2

Minimamente testado; para obter melhores resultados, em cada [ ] , adicione uma guia dentro dos colchetes:

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

A expressão sed extrai endereços de linhas que começam com a palavra nameserver seguida por um endereço IPv4 ou IPv6. A construção $() interpola a saída de sed na linha de comando de networksetup .

Se houver uma chance de que não haja nenhuma linha nameserver em /etc/resolv.conf , veja uma maneira relativamente simples:

nameservers=$(sed -ne 's/^[ ]*nameserver[ ]\+\([.:0-9A-Fa-f]\+\)//p' /etc/resolv.conf)
if [ -z "$nameservers" ]; then nameservers=empty; fi
networksetup -setdnsservers AirPort $nameservers
    
por 15.08.2010 / 00:10
1

Que tal algo como isto:

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

O regex provavelmente poderia ser melhorado.

    
por 14.08.2010 / 23:40
0

Em vez de ler /etc/resolv.conf, eu usaria networksetup -getdnsservers para obter a lista atual. A única complicação é que, se não houver nenhum atribuído, ele responderá "Não há nenhum servidor DNS configurado no AirPort", portanto você deve excluí-lo dos resultados.

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