我有一个字符串host
,它可以是主机名(没有域名)、IPv4地址或IPv6地址。
是否有一种简单的方法确定是否引用了localhost
环回设备?
Python版本:2.7
我有一个字符串host
,它可以是主机名(没有域名)、IPv4地址或IPv6地址。
是否有一种简单的方法确定是否引用了localhost
环回设备?
Python版本:2.7
您可以检查输入主机的IP地址是否在环回地址块内,对于IPv4来说是127.0.0.0/8
,对于IPv6来说则是::1
:
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
ipaddress
库! - guettli在Unix上尝试这个:
import subprocess
hn = subprocess.Popen(['hostname'], stdout=subprocess.PIPE) hn_out = hn.stdout.readline().strip('\n')
if host == '127.0.0.1' or host == '::1' or host == hn_out: print("这是本地主机")
uname -a
命令看到的值。它是没有域名的主机名。 - guettli