쉘에서 getaddrinfo()? [복사]

쉘에서 getaddrinfo()? [복사]

전화하면 ping name.domain통과된다둘 다 /etc/hostsIP를 얻기 위한 DNS 확인자입니다. 에 하드코딩된 IP일 수도 /etc/hosts있고 DNS 서버의 IP일 수도 있습니다. 물론, getaddrinfo() 또는 동등한 함수를 호출하여 이를 수행합니다(직접 호출하는 대신).

getaddrinfo()쉘에서 어떻게 호출하나요? 주소에서 IP를 얻는 "일반" 네트워크 유틸리티의 효과를 어떻게 재현할 수 있습니까?

이는 DNS만 사용하거나 /only를 사용하는 것과는 아무런 관련이 없습니다 dig. 예를 들어 확인해야 하는 이름을 수신할 때 일반적인 응용 프로그램 동작을 재현하고 싶습니다. /에 대한 다른 질문이 있습니다. 이 질문은 해당 질문과 중복되지 않습니다.hostgetenthostspingdighost

고쳐 쓰다: 내가 찾은 내용은 다음과 같습니다(일부 다른 질문에 대한 답변을 기반으로 함).

  • Ubuntu(및 Debian?) gethostip -d name.domain에는 syslinux.
  • perl -MSocket -le 'print inet_ntoa inet_aton shift' name.domain안정적으로 작동하며 허용되는 답변보다 더 간결합니다.
  • 사용getent 가능한또한 작동합니다:getent ahostsv4 name.domain | grep STREAM | head -1 | cut -f1 -d' '

이것이 가장 좋은 방법인 것 같습니다.

답변1

Perl을 사용할 수 있다면 제가 직접 출시했습니다(인터넷에서 찾아서 사용했습니다).

#!/usr/bin/perl
use Socket;

$host = shift @ARGV;
die("usage: gethostbyname hostname\n") unless(defined($host));

$packed_ip = gethostbyname($host);

if (defined $packed_ip) {
    $ip_address = inet_ntoa($packed_ip);
    print "$ip_address\n";
    exit 0
} else {
    warn "$host not found\n";
    exit 1
}

이 코드는 다음 SF Q&A에서 나왔습니다.호스트 이름을 확인하기 위해 먼저 /etc/hosts를 사용하는 Linux 명령줄 유틸리티.

$ ./gethostbyname.pl skinner
192.168.1.3

$ ./gethostbyname.pl www.google.com
74.125.225.84

$ ./gethostbyname.pl localhost
127.0.0.1

코드가 여러 Unix 시스템(Linux뿐만 아니라)에서 실행될 때 위의 접근 방식을 사용했기 때문에 이는 getent옵션이 아니었습니다.

얻다

내가 아는 매뉴얼 페이지는 파일 데이터베이스에서만 볼 것이라고 getent생각하게 만들지 만 통과할 것이라고 믿습니다 . 따라서 거기에 값으로 선언되면 서버에 구성된 DNS를 요청할 것이라고 믿습니다 . 파일에 하나가 정의되어 있다고 가정합니다.getent/etc/nsswitch.confdns/etc/resolv.conf

내 테스트에서는 내 파일에 /etc/hosts호스트 "skinner"에 대한 항목이 없지만 getentDNS를 통해 문제가 해결됩니다.

$ getent hosts skinner
192.168.1.3     skinner.bubba.net

$ grep skinner /etc/hosts
$

관련 정보