/ etc / hosts 파일은 다른 구성 파일을 참조합니다


37

/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/hostsConfigFile.txt가로드 되도록 파일에 링크 / 참조를 추가하려면 어떻게합니까 ?

답변:


39

당신은 할 수 없습니다. 의 형식 /etc/hosts은 매우 간단하며 추가 파일 포함을 지원하지 않습니다.

대신 사용할 수있는 몇 가지 방법이 있습니다.

  • (로컬 전용) DNS 서버를 설정하십시오. 이 중 일부는 많은 유연성을 제공하며 호스트 파일을 여러 파일 또는 시스템에 확실히 분산시킬 수 있습니다. dnsmasq와 같은 다른 것들은 유연성은 적지 만 (여전히 충분하지만) 설정하기 쉽습니다. 여러 머신에 동일한 호스트 목록을 포함시키려는 경우 DNS가 정답입니다.

  • 다른 이름 서비스 (NIS, LDAP 등)를 설정하십시오. 지원되는 내용은 glibc NSS 문서를 확인하십시오. 개인적으로 대부분의 경우 DNS를 사용해야한다고 생각합니다.

  • 자신에게 확인 /etc/hosts.d디렉토리 또는 유사한, 그리고 그들에게 모두 함께 연결하는 몇 가지 스크립트를 작성 (대부분의 사소한 : cat /etc/hosts.d/*.conf > /etc/hosts, 당신은 아마 더 나은 예에 조금 할 것입니다하지만, 종류 현재 로케일하여 기본을 무시)하고, 부팅시 해당 스크립트를 실행하거나, cron에서 또는 파일을 업데이트 할 때마다 수동으로.

개인적으로, 집과 직장에서 모든 장치에서 컴퓨터 이름을 확인할 수 있도록 BIND 9를 실행합니다.


감사! 각 시도가 실패한 이유가 궁금합니다. 가능하다면 훨씬 더 쉬울 것이지만, 나는 /etc/hosts.d를 사용합니다
DogEatDog

8
@DogEatDog 로컬 DNS 서버를 실행하는 것이 좋습니다. Dnsmasq는 설정하기가 매우 쉽습니다. 사용자 친화적 인 배포판에서 패키지를 설치하면 작동합니다.
Gilles 'SO- 악마 그만해'

@Gilles가 옳습니다-dnsmasq는 홈 네트워크에서 원하는 것을 정확하게 수행합니다. 알 수없는 호스트가 업스트림 DNS 서버를 통과하게하면서 MAC 주소로 모든 LAN 리소스에 고정 IP를 할당하고 호스트 이름을 부여하며 요청을 해결할 수 있습니다.
moodboom

@moodboom & Gilles 제안에 답해 주셔서 감사합니다. 2013 년에 dnsmasq를 다시 사용했는지 확실하지 않지만 지금은 확실합니다.
derobert

글로벌 확장은 (최소한에 따르면 Bash에서) 정렬LC_COLLATE 되므로 답변의 경고는 적용되지 않습니다.
l0b0

2

형식은 일반적으로 플랫폼의 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경우 기존 컨텐츠를 계속 읽는 동안 파일 쓰기를 시작 하기 때문에 별도의 단계에서 수행해야합니다 .

1

특히 가상 머신을 사용하기 때문에 동적 IP로 다른 위치에서 원활하게 작업해야하는 비슷한 요구 사항이 있습니다. 이에 대한 간단한 해결책은 다음과 같습니다.

  1. 각 엔티티의 호스트 항목을 업데이트하는 스크립트를 작성하십시오. 예를 들어 하위 도메인이 'app.myhost.net'인 'myhost.net'이라는 호스트가있는 경우 해당 스크립트를 호출하고 각 도메인에 대해 작성되어 호스트 파일에 저장된 IP 주소를 제공합니다. '나의 호스트'. 동일한 스크립트에는 단일 호스트 파일을 삭제하거나 업데이트하는 플래그가 있습니다.

  2. 다른 스크립트를 작성하여 해당 파일을 / etc / hosts에 병합하십시오. 이 스크립트는 생성 한 모든 호스트 파일을 찾아서 / etc / hosts의 단일 호스트 파일로 병합합니다.

이것은 나를 위해 완벽하게 작동했습니다. 나는 원격으로 일하고 때로는 어떤 이유로 든 위치 간을 이동해야하며 한 파일을 여러 번 편집 해야하는 부담이 있습니다. 대신 나는 단지 하나의 스크립트를 실행합니다. 예, 하나의 스크립트입니다. 첫 번째 스크립트는 자동으로 다른 스크립트를 실행하여 병합을 자동으로 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.