Itu tidak mungkin, karena format biasanya sangat dikodekan ke dalam libc platform. Namun adalah dibayangkan bahwa OS menambahkan fitur ini, membuatnya menjadi solusi non cross-platform.
Atau, Anda dapat secara otomatis memperbarui blok tertentu di file host Anda. Ini sangat membantu jika Anda memiliki skrip yang secara dinamis menampilkan entri host untuk proyek tertentu atau lebih (mungkin dengan mengubah IP).
Berikut ini contohnya: Anda ingin membuat host dari keadaan Terraform via terraform-inventory
.
Output inventaris yang relevan (misalnya, memetakan tag "Nama" EC2 ke grup yang masing-masing memiliki satu 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")'
Output skrip:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
Dan baris perintah untuk memperbarui blok yang ditandai /etc/hosts
dengan output skrip :
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
Penjelasan:
- Baris pertama jelas membuat cadangan
- Subkulit dalam tanda kurung memiliki dua
sed
panggilan untuk mencetak semua baris sebelum dan sesudah penanda dimulai / berakhir, masing-masing. Kami menyisipkan penanda dalam kasus apa pun, menempatkan output skrip di antara baris-baris itu. Bahkan jika skrip gagal, kita masih harus melingkupi konten /etc/hosts
(dan cadangan dalam skenario bencana).
sudo tee /etc/hosts.new
menulis konten yang disalurkan ke file baru
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
mencetak blok yang diperbarui untuk kenyamanan
sudo mv /etc/hosts.new /etc/hosts
memindahkan file baru ke tempatnya. Ini harus dilakukan dalam langkah terpisah karena jika buffer pipa kehabisan ruang, tee /etc/hosts
akan mulai menulis file sementara konten yang ada masih dibaca.