判断主机是否为localhost

gue*_*tli 6 python networking

我有一个字符串host,可以是主机名(没有域)、ipv4 地址或 ipv6 地址。

有没有一种简单的方法来确定这是否localhost指环回设备?

Python版本:2.7

geo*_*xsh 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,内部逻辑是相同的。