16진수 IP 주소를 호스트 이름으로 변환

16진수 IP 주소를 호스트 이름으로 변환

호스트 이름과 16진수 IP 주소 간을 전환하고 싶습니다. 나는 그것을 설치했고 syslinux-utils그것은 Debian Stretch다음을 제공합니다 gethostip:

gethostip -x google.com 
D83ACD2E

D83ACD2E호스트 이름으로 다시 전환하려면 어떻게 해야 하나요 ?

이전 버전의 데비안에서는 Wheezy다음 명령을 사용할 수 있었습니다.getaddrinfo' and 'getnameinfo

# getaddrinfo google.com
D83ACD4E
# getnameinfo D83ACD4E  
mil04s25-in-f14.1e100.net

에서는 이러한 도구를 찾을 수 없습니다 Debian Stretch. 이러한 도구가 다른 도구로 대체되었습니까?

답변1

D83ACD2E16진수로 변환하여 (네트워크 바이트 순서!) 32비트 정수로 압축한 다음 해당 정수의 (부호 없는!) 문자 구성 요소를 점으로 연결하여 인쇄할 수 있습니다 . (자세한 내용이 있으면 가능합니다.조립.)

$ perl -e 'printf "%v*d\n", ".", pack "N", hex shift' D83ACD2E
216.58.205.46
$ 

복잡성이 덜한 10진수 플래그는 gethostip값을 직접 제공 하거나 host또는nslookupgetent hosts

$ gethostip -d google.com
172.217.3.206
$ host `gethostip -d google.com`
206.3.217.172.in-addr.arpa domain name pointer sea15s12-in-f206.1e100.net.
206.3.217.172.in-addr.arpa domain name pointer sea15s12-in-f14.1e100.net.
$ getent hosts `gethostip -d google.com`
172.217.3.206   sea15s12-in-f206.1e100.net
$ 

이는 특정 IP 주소와 연결된 DNS PTR 레코드로, 설정될 수도 있고 설정되지 않을 수도 있고 찾고 있는 호스트 이름일 수도 있고 아닐 수도 있습니다.

아니면 여기저기 검색해보면apt-file

$ sudo apt-file search getaddrinfo | grep 'getaddrinfo$'
gnulib: /usr/share/gnulib/modules/getaddrinfo
libruli-bin: /usr/bin/ruli-getaddrinfo
libsocket-getaddrinfo-perl: /usr/bin/socket_getaddrinfo
$ sudo apt-file search getnameinfo | grep 'getnameinfo$'
libsocket-getaddrinfo-perl: /usr/bin/socket_getnameinfo
$ sudo apt-get install libsocket-getaddrinfo-perl
...

하지만 해당 버전은 귀하의 기호를 지원하지 않는 것 같습니다.

$ socket_getnameinfo D83ACD4E
Unrecognised address or port format - Name or service not known
$ 

0x그러나 일반 16진수 접두사를 사용하는 경우

$ socket_getnameinfo 0xD83ACD4E
Resolved address '0xD83ACD4E'

  mil04s25-in-f78.1e100.net
$ 

(맨 페이지에 따르면 데비안은 프로그램 이름을 바꾸었는데, 지금은 LeoNerd가 얼마 전 IRC에서 언급한 것을 기억합니다...)

이를 받아들이겠다고 고집한다면 D83ACD4E위의 방법을 사용하여 hex값을 디지털화하고 패킹한 후 Socket모듈 기능을 통해 맹목적으로 처리할 수 있습니다. 하지만 실제로는 오류 검사, 입력 유효성 검사, 테스트 등을 갖춘 스크립트여야 합니다.

$ perl -MSocket=:addrinfo,pack_sockaddr_in \
  -E '($e,$h)=getnameinfo pack_sockaddr_in(0, pack("N", hex shift));' \
  -E 'say $h' D83ACD2E
mil04s24-in-f46.1e100.net
$ 

답변2

여기서 glibc를 사용할 수 있습니다 getent:

$ getent ahostsv4 0xD83ACD2E | { read ip rest && getent hosts "$ip"; }
216.58.205.46   mil04s24-in-f46.1e100.net

또 다른 perl방법:

$ perl -MSocket -le '($n)=gethostbyaddr(inet_aton("0xD83ACD2E"), AF_INET); print $n'
mil04s24-in-f46.1e100.net

관련 정보