Bu mümkün değildir, çünkü format genellikle platformların libc'sine derinden kodlanmıştır. Ancak bir işletim sisteminin bu özelliği eklediği ve platformlar arası olmayan bir çözüm olduğu düşünülebilir.
Alternatif olarak, ana makinenizdeki belirli bir bloğu otomatik olarak güncelleyebilirsiniz. Bu, belirli bir proje için ana bilgisayar girişlerini dinamik olarak çıkaran bir komut dosyanız varsa (belki de değişen IP'ler), bu özellikle yararlıdır.
İşte bir örnek: Terraform eyaletinden ana bilgisayarlar oluşturmak istiyorsunuz terraform-inventory
.
İlgili envanter çıktısı (örneğin, bir EC2 "Ad" etiketinin her birinin tam olarak bir ana bilgisayar grubuyla eşleştirilmesi):
$ 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")'
Komut dosyası çıktısı:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
Ve işaretli bir bloğu /etc/hosts
script çıktısıyla güncellemek için komut satırı :
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
Açıklama:
- İlk satır açıkçası bir yedekleme yaratıyor
- Parantez içindeki alt kabuk
sed
, sırasıyla marker başlama / bitişinden önceki ve sonraki tüm satırları yazdırmak için iki çağrıya sahiptir. İşaretleyicileri her durumda komut dosyasının çıktısını bu satırların arasına koyarak yerleştiririz. Senaryo başarısız olsa bile, çevreleyen içeriğe /etc/hosts
(ve felaket bir senaryoda yedeklemeye) ihtiyacımız var.
sudo tee /etc/hosts.new
piped içeriğini yeni bir dosyaya yazar
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
güncellenmiş bloğu rahatlık için yazdırır
sudo mv /etc/hosts.new /etc/hosts
yeni dosyayı yerine taşır. Bu, ayrı bir adımda yapılmalıdır, çünkü eğer boru tamponu boşluk biterse tee /etc/hosts
, mevcut içerik hala okunurken dosyayı yazmaya başlayacaktır.