Non è possibile, dato che il formato è di solito profondamente codificato nella libc delle piattaforme. Tuttavia è immaginabile che un sistema operativo aggiunga questa funzionalità, rendendola una soluzione non multipiattaforma.
In alternativa, puoi aggiornare automaticamente un determinato blocco nel file hosts. Ciò è particolarmente utile se si dispone di uno script che genera in modo dinamico voci host per un determinato progetto o giù di lì (possibilmente con la modifica degli IP).
Ecco un esempio: vuoi creare host dallo stato Terraform tramite terraform-inventory
.
Output di inventario pertinente (ad esempio, mappando un tag "Nome" EC2 su gruppi di esattamente un host ciascuno):
$ 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")'
Output dello script:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
E la riga di comando per aggiornare un blocco contrassegnato /etc/hosts
con l'output dello 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
Spiegazione:
- La prima riga ovviamente crea un backup
- La subshell tra parentesi ha due
sed
chiamate per stampare tutte le righe prima e dopo l'inizio / fine del marker, rispettivamente. Inseriamo gli indicatori in ogni caso, inserendo l'output dello script tra quelle righe. Anche se lo script fallisce, dobbiamo comunque circondare il contenuto di /etc/hosts
(e il backup in uno scenario catastrofico).
sudo tee /etc/hosts.new
scrive il contenuto reindirizzato in un nuovo file
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
stampa il blocco aggiornato per comodità
sudo mv /etc/hosts.new /etc/hosts
sposta il nuovo file in posizione. Questo deve essere fatto in una fase separata perché se il buffer della pipe esaurisce lo spazio, tee /etc/hosts
inizierebbe a scrivere il file mentre il contenuto esistente è ancora in fase di lettura.