Tenho um programa que executará um conjunto de comandos em novas instalações de servidor e preciso alterar uma entrada em um arquivo para cada instalação. Precisamos alterar o DNS padrão de 127.0.0.X (que é o padrão, pois instala sem uma conexão com a Internet) para 8.8.8.8
Eu estava usando o seguinte comando:
sudo awk '{sub(/#DNS=/,"DNS=8.8.8.8")}' /etc/systemd/resolved.conf
no entanto, isso não parece estar funcionando no gawk/nova versão do sistema operacional.
sudo gawk '{gensub(/#DNS=/,"DNS=8.8.8.8")}' /etc/systemd/resolved.conf
O que estou fazendo errado? Existe uma maneira melhor de alterar a entrada DNS padrão?
Sistema operacional do servidor atual:Ubuntu 24.04.2-live-server
Sistema operacional do servidor anterior:Ubuntu 20.04.6-live-server
EDITAR:
Arquivo de entrada de linha de amostra:
#DNS=
#FallbackDNS=
#Domains
O comando deve encontrar a primeira linha acima e substituí-la por DNS=8.8.8.8
"mas não é".
Saída desejada:
DNS=8.8.8.8
#FallbackDNS=
#Domains
Quando executo o comando awk, o arquivo ainda lê:
#DNS=
#FallbackDNS=
#Domains
Além disso, ele deve encontrar e substituir apenas uma correspondência exata de#DNS=
Qual comando e sintaxe substituirão #DNS=
por DNS=8.8.8.8
?
O segundo script do OP
awk
deve estar gerando um erro de sintaxe semelhante a:Isso ocorre devido à ausência do terceiro argumento em
gensub()
.Deixando de lado o erro de sintaxe, nenhum dos
awk
scripts do OP inclui um comando para imprimir algo no stdout.Modificando o primeiro
awk
script do OP para imprimir todas as linhas (modificadas) no stdout:Com esta modificação vemos:
Observe que essas linhas são exibidas no console, deixando-nos com a próxima questão... como fazer essas alterações em
resolved.conf
.O OP tem algumas opções:
Diretiva de uso
gawk's
-i inplace
:Direcione o stdout para um arquivo temporário e então substitua
resolved.conf
com o conteúdo do arquivo temporárioUm script alternativo
awk
para substituir a linha que começa com#DNS=
, e fazendo uso da-i inplace
diretiva:Entendo a afirmação "Além disso, ele deve encontrar e substituir apenas uma correspondência exata de
#DNS=
" como "substituir uma linha que corresponda exatamente à string sem nenhum caractere antes ou depois dela".Isso significa que você não precisa substituir uma substring/padrão, você pode substituir a linha inteira.
Explicação:
/^#DNS=$/
se a linha do início ao fim corresponder,#DNS=
$0 = "DNS=8.8.8.8"
substitua a linha inteira pelo1
atalho de string para{ print }
(=true
condição com ação padrãoprint
)Observe que o comando acima não atualiza o arquivo de entrada.
Você poderia usar algo assim: