我有一个字符串host
,它可以是主机名(没有域名),ipv4地址或ipv6地址。
是否有一种简单的方法可以确定这是否指的是localhost
环回设备?
Python版本:2.7
答案 0 :(得分:2)
您可以检查输入主机的IP地址是loopback address block,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)
的产率:
localhost True
alias-of-localhost True
google.com False
更新:python3 ipaddress
库有a python2 backport,您可以用检查其.is_loopback
属性替换检查器部分,内部逻辑是相同的。
答案 1 :(得分:0)
在Unix上试试这个:
导入子流程
hn = subprocess.Popen([' hostname'],stdout = subprocess.PIPE) hn_out = hn.stdout.readline()。strip(' \ n')
如果主持人==' 127.0.0.1'或主持人==' :: 1'或主持人== hn_out: 打印("它是localhost")