我有一个字符串host,可以是主机名(没有域)、ipv4 地址或 ipv6 地址。
有没有一种简单的方法来确定这是否localhost指环回设备?
Python版本:2.7
您可以检查输入主机的 IP 地址是否在环回地址块内,127.0.0.0/8对于 IPv4,::1对于 IPv6:
import socket
import struct
def is_loopback(host):
loopback_checker = {
socket.AF_INET: lambda x: struct.unpack('!I', socket.inet_aton(x))[0] >> (32-8) == 127,
socket.AF_INET6: lambda x: x == '::1'
}
for family in (socket.AF_INET, socket.AF_INET6):
try:
r = socket.getaddrinfo(host, None, family, socket.SOCK_STREAM)
except socket.gaierror:
return False
for family, _, _, _, sockaddr in r:
if not loopback_checker[family](sockaddr[0]):
return False
return True
for host in ('localhost', 'alias-of-localhost', 'google.com'):
print host, is_loopback(host)
Run Code Online (Sandbox Code Playgroud)
产量:
localhost True
alias-of-localhost True
google.com False
Run Code Online (Sandbox Code Playgroud)
更新: python3库有一个 python2 向后移植ipaddress,您可以通过检查其属性来替换检查器部分.is_loopback,内部逻辑是相同的。