Ce n'est pas possible, car le format est généralement profondément codé dans la libc des plateformes. Cependant, il est imaginable qu'un système d'exploitation ajoute cette fonctionnalité, ce qui en fait une solution non multiplateforme.
Vous pouvez également mettre à jour automatiquement un certain bloc dans votre fichier hosts. Ceci est particulièrement utile si vous avez un script qui génère dynamiquement des entrées d’hôte pour un projet donné (ou peut-être avec des adresses IP changeantes).
Voici un exemple: vous voulez créer des hôtes à partir de l’état Terraform via terraform-inventory
.
Résultats d'inventaire pertinents (par exemple, mappage d'une balise "Nom" EC2 sur des groupes comprenant exactement un hôte chacun):
$ 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")'
Sortie du script:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
Et la ligne de commande pour mettre à jour un bloc marqué /etc/hosts
avec la sortie du 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
Explication:
- La première ligne crée évidemment une sauvegarde
- Le sous-shell entre parenthèses a deux
sed
appels pour imprimer toutes les lignes avant et après le début / la fin du marqueur, respectivement. Nous insérons les marqueurs dans tous les cas, en plaçant la sortie du script entre ces lignes. Même si le script échoue, nous devons toujours entourer le contenu de /etc/hosts
(et la sauvegarde dans un scénario catastrophique).
sudo tee /etc/hosts.new
écrit le contenu diffusé dans un nouveau fichier
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
imprime le bloc mis à jour pour plus de commodité
sudo mv /etc/hosts.new /etc/hosts
déplace le nouveau fichier en place. Cela doit être effectué dans une étape distincte, car si le tampon de canal manque d'espace, tee /etc/hosts
l'écriture du fichier commence alors que le contenu existant est encore en cours de lecture.