No es posible, ya que el formato suele estar profundamente codificado en la plataforma libc. Sin embargo, es imaginable que un sistema operativo agregue esta característica, por lo que no es una solución multiplataforma.
Alternativamente, puede actualizar automáticamente un determinado bloque en su archivo de hosts. Esto es particularmente útil si tiene un script que genera dinámicamente entradas de host para un determinado proyecto (posiblemente con cambios de IP).
Aquí hay un ejemplo: desea crear hosts desde el estado Terraform a través de terraform-inventory
.
Salida de inventario relevante (por ejemplo, mapeando una etiqueta "Nombre" de EC2 a grupos de exactamente un host cada uno):
$ 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")'
Salida de script:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
Y la línea de comando para actualizar un bloque marcado /etc/hosts
con la salida del script :
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
Explicación:
- La primera línea obviamente crea una copia de seguridad
- El subshell entre paréntesis tiene dos
sed
llamadas para imprimir todas las líneas antes y después del comienzo / final del marcador, respectivamente. Insertamos los marcadores en cualquier caso, colocando el resultado del script entre esas líneas. Incluso si el script falla, todavía tenemos que incluir el contenido de /etc/hosts
(y la copia de seguridad en un escenario catastrófico).
sudo tee /etc/hosts.new
escribe el contenido canalizado en un nuevo archivo
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
imprime el bloque actualizado para mayor comodidad
sudo mv /etc/hosts.new /etc/hosts
mueve el nuevo archivo a su lugar. Esto debe hacerse en un paso separado porque si el búfer de tubería se queda sin espacio, tee /etc/hosts
comenzaría a escribir el archivo mientras el contenido existente aún se está leyendo.