Це неможливо, оскільки формат, як правило, глибоко закодований у libc платформ. Однак можна уявити, що ОС додає цю функцію, що робить її неплатформовим рішенням.
Крім того, ви можете автоматично оновити певний блок у файлі хостів. Це особливо корисно, якщо у вас є сценарій, який динамічно виводить записи хостів для певного проекту чи так (можливо, із зміною IP-адрес).
Ось приклад: ви хочете створити хости із стану Terraform через terraform-inventory
.
Відповідний вихід інвентаря (наприклад, відображення тегу EC2 "Ім'я" в групи точно по одному хосту):
$ 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-update-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")'
Вихід сценарію:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
І командний рядок для оновлення позначеного блоку /etc/hosts
із вихідним сценарієм :
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
Пояснення:
- Перший рядок очевидно створює резервну копію
- У підпакеті в дужках є два
sed
виклики для друку всіх рядків до початку та закінчення маркера відповідно. Ми вставляємо маркери в будь-якому випадку, розміщуючи вихід скрипта між цими рядками. Навіть якщо сценарій не працює, ми все одно повинні оточувати вміст /etc/hosts
(і резервне копіювання в катастрофічному сценарії).
sudo tee /etc/hosts.new
записує контентний вміст у новий файл
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
друкує оновлений блок для зручності
sudo mv /etc/hosts.new /etc/hosts
переміщує новий файл на місце. Це потрібно зробити на окремому етапі, оскільки якщо в буфері труби не вистачає місця, він tee /etc/hosts
би почав записувати файл, поки наявний вміст ще читається.