Ip

將十六進制 IP 地址轉換為主機名

  • September 20, 2018

我想在主機名和十六進制 IP 地址之間切換,反之亦然。我已經安裝syslinux-utilsDebian Stretch,它提供gethostip

gethostip -x google.com 
D83ACD2E

如何切換D83ACD2E回主機名?

在舊版本的 DebianWheezy中,我可以使用命令getaddrinfo' and 'getnameinfo

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

我無法在Debian Stretch. 這些工具是否被其他工具取代?

您可以在getent這裡使用 glibc:

$ 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

您可以 hexify D83ACD2E,將其打包成(網路字節順序!)32 位整數,然後列印由點連接的整數的(無符號!)字元組件。(如果在彙編中更冗長,這也是可能的。)

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

使用較少的複雜性,十進制標誌gethostip直接給出該值,然後可以將其饋送到hostnslookupgetent 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的十六進制前綴

$ socket_getnameinfo 0xD83ACD4E
Resolved address '0xD83ACD4E'

 mil04s25-in-f78.1e100.net
$ 

(根據手冊頁 Debian 確實重命名了該程序,我現在記得 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
$ 

引用自:https://unix.stackexchange.com/questions/413312