![将十六进制 IP 地址转换为主机名](https://linux22.com/image/124428/%E5%B0%86%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%20IP%20%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%B8%BB%E6%9C%BA%E5%90%8D.png)
我想在主机名和十六进制 IP 地址之间切换,反之亦然。我已经安装syslinux-utils
了Debian 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
直接给出该值,然后可以将其馈送到host
ornslookup
或getent 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