确定主机是否为localhost

时间:2017-12-19 11:19:10

标签: python networking

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

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

Python版本:2.7

2 个答案:

答案 0 :(得分:2)

您可以检查输入主机的IP地址是loopback address block127.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')

测试是否"主持人" string是IPv4环回地址,IPv6环回地址或者它是本地主机名

如果主持人==' 127.0.0.1'或主持人==' :: 1'或主持人== hn_out:     打印("它是localhost")