/etc/hosts
파일이 호스트 목록에 대한 다른 구성 파일을 참조하도록 하려면 어떻게 해야합니까?
예 /etc/hosts
:
## My Hosts
127.0.0.1 localhost
255.255.255.255 broadcasthost
#Other Configurations
<Link to /myPath/to/MyConfig/ConfigFile.txt>
#Other Addresses
3.3.3.3 MyAwesomeDomain.com
4.4.4.4 SomeplaceIWantToGoTo.com
ConfigFile.txt
##My additional Hosts
1.1.1.1 SomeLocation.com
2.2.2.2 AnotherLocation.com
/etc/hosts
ConfigFile.txt가로드 되도록 파일에 링크 / 참조를 추가하려면 어떻게합니까 ?
답변
당신은 할 수 없습니다. 의 형식 /etc/hosts
은 매우 간단하며 추가 파일 포함을 지원하지 않습니다.
대신 사용할 수있는 몇 가지 방법이 있습니다.
-
(로컬 전용) DNS 서버를 설정하십시오. 이 중 일부는 많은 유연성을 제공하며 호스트 파일을 여러 파일 또는 시스템에 확실히 분산시킬 수 있습니다. dnsmasq와 같은 다른 것들은 유연성은 적지 만 (여전히 충분하지만) 설정하기 쉽습니다. 여러 머신에 동일한 호스트 목록을 포함시키려는 경우 DNS가 정답입니다.
-
다른 이름 서비스 (NIS, LDAP 등)를 설정하십시오. 지원되는 내용은 glibc NSS 문서를 확인하십시오. 개인적으로 대부분의 경우 DNS를 사용해야한다고 생각합니다.
-
자신에게 확인
/etc/hosts.d
디렉토리 또는 유사한, 그리고 그들에게 모두 함께 연결하는 몇 가지 스크립트를 작성 (대부분의 사소한 :cat /etc/hosts.d/*.conf > /etc/hosts
, 당신은 아마 더 나은 예에 조금 할 것입니다하지만, 종류 현재 로케일하여 기본을 무시)하고, 부팅시 해당 스크립트를 실행하거나, cron에서 또는 파일을 업데이트 할 때마다 수동으로.
개인적으로, 집과 직장에서 모든 장치에서 컴퓨터 이름을 확인할 수 있도록 BIND 9를 실행합니다.
답변
형식은 일반적으로 플랫폼의 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
경우 기존 컨텐츠를 계속 읽는 동안 파일 쓰기를 시작 하기 때문에 별도의 단계에서 수행해야합니다 .
답변
특히 가상 머신을 사용하기 때문에 동적 IP로 다른 위치에서 원활하게 작업해야하는 비슷한 요구 사항이 있습니다. 이에 대한 간단한 해결책은 다음과 같습니다.
-
각 엔티티의 호스트 항목을 업데이트하는 스크립트를 작성하십시오. 예를 들어 하위 도메인이 ‘app.myhost.net’인 ‘myhost.net’이라는 호스트가있는 경우 해당 스크립트를 호출하고 각 도메인에 대해 작성되어 호스트 파일에 저장된 IP 주소를 제공합니다. ‘나의 호스트’. 동일한 스크립트에는 단일 호스트 파일을 삭제하거나 업데이트하는 플래그가 있습니다.
-
다른 스크립트를 작성하여 해당 파일을 / etc / hosts에 병합하십시오. 이 스크립트는 생성 한 모든 호스트 파일을 찾아서 / etc / hosts의 단일 호스트 파일로 병합합니다.
이것은 나를 위해 완벽하게 작동했습니다. 나는 원격으로 일하고 때로는 어떤 이유로 든 위치 간을 이동해야하며 한 파일을 여러 번 편집 해야하는 부담이 있습니다. 대신 나는 단지 하나의 스크립트를 실행합니다. 예, 하나의 스크립트입니다. 첫 번째 스크립트는 자동으로 다른 스크립트를 실행하여 병합을 자동으로 수행합니다.