Não é possível, pois o formato geralmente é profundamente codificado na libc das plataformas. No entanto, é possível que um sistema operacional adicione esse recurso, tornando-o uma solução não multiplataforma.
Como alternativa, você pode atualizar automaticamente um determinado bloco no seu arquivo hosts. Isso é particularmente útil se você tiver um script que produz dinamicamente entradas de host para um determinado projeto ou mais (possivelmente com alteração de IPs).
Aqui está um exemplo: você deseja criar hosts a partir do estado Terraform via terraform-inventory
.
Saída de inventário relevante (por exemplo, mapeando uma tag "Nome" do EC2 para grupos de exatamente um host cada):
$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
"name_myhost-a": [
"10.101.118.131"
],
"name_myhost-b": [
"10.101.111.189"
]
}
print-updated-hosts-entries.sh
#!/bin/sh
exec terraform-inventory --list | \
jq -r 'to_entries |
map(select(.key | match("^name_"))) |
map(.value[0] + " " + .key[5:]) |
join("\n")'
Saída de script:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
E a linha de comando para atualizar um bloco marcado /etc/hosts
com a saída do script :
sudo cp /etc/hosts "/etc/hosts.bak.$(date +%Y%m%d%H%M%S)" && \
(
sed -n '1,/^# MYMARKER BEGIN/{/^# MYMARKER BEGIN/!p;}' /etc/hosts; \
echo "# MYMARKER BEGIN"; \
./print-updated-hosts-entries.sh; \
echo "# MYMARKER END"; \
sed -n '/^# MYMARKER END/,${/^# MYMARKER END/!p;}' /etc/hosts; \
) | \
sudo tee /etc/hosts.new | \
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' && \
sudo mv /etc/hosts.new /etc/hosts
Explicação:
- A primeira linha obviamente cria um backup
- O subshell entre parênteses possui duas
sed
chamadas para imprimir todas as linhas antes e depois do início / fim do marcador, respectivamente. Em qualquer caso, inserimos os marcadores, colocando a saída do script entre essas linhas. Mesmo se o script falhar, ainda temos o conteúdo circundante de /etc/hosts
(e o backup em um cenário catastrófico).
sudo tee /etc/hosts.new
grava o conteúdo canalizado em um novo arquivo
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
imprime o bloco atualizado por conveniência
sudo mv /etc/hosts.new /etc/hosts
move o novo arquivo no lugar. Isso deve ser feito em uma etapa separada, porque se o buffer do canal ficar sem espaço, tee /etc/hosts
começaria a gravar o arquivo enquanto o conteúdo existente ainda estiver sendo lido.