确定主机是否为本地主机

6

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

是否有一种简单的方法确定是否引用了localhost环回设备?

Python版本:2.7


2
当使用localhost时,“host”的值是什么? - Andy G
1
ipaddress库中有is_loopback方法。这可能会有所帮助! - Vivek Harikrishnan
@AndyG "host" 的值是您使用 uname -a 命令看到的值。它是没有域名的主机名。 - guettli
@VivekHarikrishnan 我们仍在使用Python2.7。据我所知,ipaddress库是从Python3开始引入的。 - guettli
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

更新:现在有一个 Python 3 的 ipaddress 库的 Python 2 回溯版本,你可以用它的 .is_loopback 属性来替换检查器部分,内部逻辑是一样的。请看链接:https://pypi.python.org/pypi/py2-ipaddress

是的,这个库很好用。感谢您提示Python2中也有ipaddress库! - guettli

0

在Unix上尝试这个:

你需要subprocess模块来查找本地主机名

import subprocess

hn = subprocess.Popen(['hostname'], stdout=subprocess.PIPE) hn_out = hn.stdout.readline().strip('\n')

测试“host”字符串是否为IPv4环回地址、IPv6环回地址或本地主机名

if host == '127.0.0.1' or host == '::1' or host == hn_out: print("这是本地主机")


我不确定127.0.0.2是否也是本地主机。 - guettli
我已经有了字符串“host”。我猜你回答中的子进程部分是不需要的。 - guettli
1
“我不确定127.0.0.2是否也是本地主机。” @guettli 请参阅此问题的答案。 - Ron Maupin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接