Это невозможно, так как формат обычно глубоко закодирован в libc платформ. Однако это можно себе представить , что ОС добавляет эту функцию, что делает его не кроссплатформенное решение.
Кроме того, вы можете автоматически обновить определенный блок в вашем файле hosts. Это особенно полезно, если у вас есть скрипт, который динамически выводит записи хоста для определенного проекта или около того (возможно, с изменением 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-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")'
Вывод скрипта:
./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
начнется запись файла, пока существующий контент еще читается.