/etc/hosts를 읽는 프로그램/애플리케이션 또는 스크립트

/etc/hosts를 읽는 프로그램/애플리케이션 또는 스크립트

이름 확인이 필요할 때 /etc/hosts를 열고 읽는 프로그램이나 스크립트의 이름은 무엇입니까? Linux/Unix 배포판마다 다릅니까?

호스트의 매뉴얼 페이지를 읽고 whereis에서 호스트라는 바이너리를 찾으려고 했지만 whereis는 /etc/hosts.allow 및 /etc/hosts.deny와 같은 파일 이름을 출력합니다. 나는 Hosts.allow와 Host.deny가 TCPWrappers용 구성 파일이라는 인상을 받았고 시작했을 때보다 지금이 훨씬 더 혼란스럽습니다.

답변1

구체적이지 않음프로그램이 파일을 구문 분석하십시오.

많은 표준 파일(예: /etc/hosts)은 표준 라이브러리 파일(예: )에 의해 구문 분석됩니다 gethostbyname(3). 그러나 이야기는 훨씬 더 복잡할 수 있습니다.

호스트 이름 확인은 일반적으로 /etc/nsswitch.conf.

예를 들어

% grep hosts /etc/nsswitch.conf
hosts:      files dns

이 항목은 파서 루틴에 "파일" 백엔드를 사용하고 거기에서 결과가 발견되지 않으면 DNS 조회를 수행하도록 지시합니다. 여기에 다른 값(예: ldap또는 nis)을 입력하면 호스트 이름이 조회되는 방식이 변경될 수 있습니다.

이러한 루틴을 종종 "이름 지정 서비스"라고 합니다. 사용자 이름 조회( passwd), 그룹 항목( group) 등에 대해서도 동일한 개념이 사용됩니다 .

따라서 이 작업을 수행하면 ping a.remote.host프로그램 ping은 glibc 라이브러리 함수를 호출하여 로드됩니다 nsswitch.conf. 결과적으로 ping라이브러리 및 NS 루틴이 자체적으로 작업을 수행하는 것을 볼 수 없습니다.

이름 검색을 수행하는 데 사용할 수 있는 이름 검색이라는 프로그램이 있습니다 getent. "데이터베이스"(데이터베이스의 항목 중 하나 nsswitch.conf)와 검색하려는 값을 지정합니다.

그래서

getent hosts a.remote.host

이름 조회는 에 정의된 규칙에 따라 수행됩니다 nsswitch.conf. 이는 테스트 목적으로 유용하며 때로는 스크립트에 유용합니다.

---부록----

이 정보는 아래 Stephen의 의견에서 나온 것이지만 매우 유용하므로 그의 답변에 추가하겠습니다.

strace getent hosts www.google.com 2>&1 | grep libnss_

이름을 확인하는 데 사용할 라이브러리(또는 없음)를 알려줍니다. 라고 적혀 있으면 사용되는 libnss_files/etc/hosts입니다. 이 나타나면 libnss_dnsDNS가 사용되는 것입니다. libnss_myhostname아무 것도 작동하지 않았고 백업 GNU 시스템이 작동하지 않았다는 의미입니다(그리고 아마도 이미 실패했을 수도 있습니다). 나열된 라이브러리가 없으면 아마도 숫자 주소(예: )를 사용하고 있으므로 127.0.0.1파서가 필요하지 않은 것입니다.

답변2

GNU/Linux 시스템에서는 /etc/hosts일반적으로 라이브러리에서 읽습니다 glibc.

바라보다GNU 문서이 주제에 대해:

내부적으로 시스템은 데이터베이스를 사용하여 호스트 이름과 호스트 번호 간의 매핑을 추적합니다. 이 데이터베이스는 일반적으로 /etc/hosts 파일 또는 이름 서버에서 제공하는 동등한 파일입니다. 데이터베이스에 액세스하는 데 사용되는 함수 및 기타 기호는 netdb.h에 선언되어 있습니다. 이는 BSD 기능이며 netdb.h가 포함되면 무조건 정의됩니다.

모든 POSIX 호환 UNIX 및 UNIX 유사 시스템은 netdb.h가 다음과 같기 때문에 이 지침을 따릅니다.POSIX 표준. 주요 차이점은 모든 UNIX 시스템이 glibc.

GNU 문서에서는 에서 수집된 데이터를 읽는 및 같은 gethostbyname함수에 대해서도 설명합니다 . 두 기능 모두 오늘날 사실상 더 이상 사용되지 않습니다.gethostbyaddr/etc/hostsgetaddrinfo그리고getnameinfo사용되어야한다.

관련 정보