이름 확인이 필요할 때 /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_dns
DNS가 사용되는 것입니다. 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/hosts
getaddrinfo
그리고getnameinfo
사용되어야한다.