형식은 일반적으로 플랫폼의 libc에 심층적으로 코딩되므로 불가능합니다. 그러나 OS가이 기능을 추가하여 플랫폼 간 솔루션이 아닌 것으로 상상할 수 있습니다.
또는 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
경우 기존 컨텐츠를 계속 읽는 동안 파일 쓰기를 시작 하기 때문에 별도의 단계에서 수행해야합니다 .