将十六进制 IP 地址转换为主机名

将十六进制 IP 地址转换为主机名

我想在主机名和十六进制 IP 地址之间切换,反之亦然。我已经安装syslinux-utilsDebian Stretch,它提供了gethostip

gethostip -x google.com 
D83ACD2E

如何切换D83ACD2E回主机名?

在旧版本的 Debian 中Wheezy,我可以使用命令getaddrinfo' and 'getnameinfo

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

我无法在 中找到这些工具Debian Stretch。这些工具是否已被其他工具取代?

答案1

您可以将其十六进制化D83ACD2E,将其打包为(网络字节顺序!)32 位整数,然后打印该整数的(无符号!)字符组件,并用点连接起来。 (如果更详细的话这也是可能的组装中.)

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

复杂性较少,十进制标志gethostip直接给出该值,然后可以将其馈送到hostornslookupgetent 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模块函数盲目地进行处理。但这确实应该是一个带有错误检查、输入验证、测试的脚本,ETC

$ 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

您可以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

相关内容