Dies ist nicht möglich, da das Format normalerweise tief in der libc der Plattform kodiert ist. Es ist jedoch vorstellbar, dass ein Betriebssystem diese Funktion hinzufügt, was es zu einer plattformübergreifenden Lösung macht.
Alternativ können Sie einen bestimmten Block in Ihrer Hosts-Datei automatisch aktualisieren. Dies ist besonders hilfreich, wenn Sie über ein Skript verfügen, das Hosteinträge für ein bestimmtes Projekt dynamisch ausgibt (möglicherweise mit wechselnden IP-Adressen).
Hier ist ein Beispiel: Sie möchten Hosts aus dem Terraform-Status über erstellen terraform-inventory
.
Relevante Inventarausgabe (z. B. Zuordnung eines EC2-Tags "Name" zu Gruppen mit jeweils genau einem Host):
$ 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")'
Skriptausgabe:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
Und die Befehlszeile, um einen markierten Block /etc/hosts
mit der Skriptausgabe zu aktualisieren :
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
Erläuterung:
- Die erste Zeile erstellt offensichtlich ein Backup
- Die in Klammern gesetzte Unterschale hat zwei
sed
Aufrufe, um alle Zeilen vor und nach dem Beginn bzw. Ende der Markierung zu drucken. In jedem Fall fügen wir die Markierungen ein und setzen die Skriptausgabe zwischen diese Zeilen. Auch wenn das Skript fehlschlägt, müssen wir immer noch den Inhalt /etc/hosts
(und die Sicherung in einem katastrophalen Szenario) umgeben.
sudo tee /etc/hosts.new
Schreibt den weitergeleiteten Inhalt in eine neue Datei
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
druckt den aktualisierten Block aus
sudo mv /etc/hosts.new /etc/hosts
verschiebt die neue Datei an ihren Platz. Dies muss in einem separaten Schritt erfolgen, da der Pipe-Puffer, wenn nicht genügend Speicherplatz tee /etc/hosts
vorhanden ist, die Datei schreiben würde, während der vorhandene Inhalt noch gelesen wird.