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

Mar*_*ter 6 ip tftp hex

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

gethostip -x google.com 
D83ACD2E
Run Code Online (Sandbox Code Playgroud)

如何切换D83ACD2E回主机名?

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

# getaddrinfo google.com
D83ACD4E
# getnameinfo D83ACD4E  
mil04s25-in-f14.1e100.net
Run Code Online (Sandbox Code Playgroud)

我无法在Debian Stretch. 这些工具被其他工具取代了吗?

thr*_*rig 14

您可以 hexify D83ACD2E,将其打包成(网络字节顺序!)32 位整数,然后打印该整数的(无符号!)由点连接的字符组件。(如果在 assembly 中稍微详细一些,这也是可能的。)

$ perl -e 'printf "%v*d\n", ".", pack "N", hex shift' D83ACD2E
216.58.205.46
$ 
Run Code Online (Sandbox Code Playgroud)

用更少的并发症十进制标志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
$ 
Run Code Online (Sandbox Code Playgroud)

那是与给定 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
...
Run Code Online (Sandbox Code Playgroud)

但该版本似乎不支持您的符号:

$ socket_getnameinfo D83ACD4E
Unrecognised address or port format - Name or service not known
$ 
Run Code Online (Sandbox Code Playgroud)

但如果使用传统0x的十六进制前缀

$ socket_getnameinfo 0xD83ACD4E
Resolved address '0xD83ACD4E'

  mil04s25-in-f78.1e100.net
$ 
Run Code Online (Sandbox Code Playgroud)

(根据手册页 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
$ 
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 7

您可以在getent此处使用 glibc :

$ getent ahostsv4 0xD83ACD2E | { read ip rest && getent hosts "$ip"; }
216.58.205.46   mil04s24-in-f46.1e100.net
Run Code Online (Sandbox Code Playgroud)

另一种perl方法:

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