【问题标题】:Python: detect http request to localhost httplib2Python:检测对本地主机 httplib2 的 http 请求
【发布时间】:2015-07-22 23:24:55
【问题描述】:

我在 python 中创建了一个服务器,在收到 HTTP 请求后,它会将请求发送到其他服务器。有时它会向自己发送请求,这会导致问题。有没有办法检测一个 IP 地址是否是它自己的地址?

它在云中的虚拟机中运行,无需访问外部互联网。那么有没有办法检测例如 10.158.3.251:5555 是运行代码的机器的 localhost?

编辑: 现在从 ifconfig 命令获取 IP 地址。感觉很笨拙,但很有效:

cmd = "/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'"
self.ip = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]

打开以获得更好的解决方案,问题是预期的映射(10.158.3.250 virtual-158-3-250.xxx.xx)不在 /etc/hosts 文件中。

【问题讨论】:

    标签: python ip localhost


    【解决方案1】:
     import socket
     from socket import *
     myip = gethostbyname(gethostname())
     if(myip == destip):
       #do whatever
    

    【讨论】:

    • 给出 NameError: name 'gethostbyname' is not defined,如果你的意思是 socket.gethostbyname(socket.gethostname()) 它给出 socket.gaierror: [Errno -2] Name or service not known跨度>
    • 异常中的字符串说明了什么
    • 什么意思?我复制了完整的异常,但不清楚是什么问题
    • 是您的主机文件设置来将“localhost”解析为 127.0.0.1 吗?
    • 你是对的,localhost 在 hosts 文件中解析为 127.0.0.1。这是怎么回事?
    【解决方案2】:

    我认为最好的方法就是检查地址是否恰好是主机的地址之一。 正如this post 中提到的,您可以通过多种方式获取主机的 IP 地址列表,但我特别喜欢这种方法:

    import socket
    ips = socket.gethostbyname_ex(socket.gethostname())[2]
    

    现在您可以检查给定的 IP 是否恰好在列表中。 至于gethostbyname(gethostname()),这似乎是一个部分解决方案,因为它没有返回完整的地址列表(当我使用它时,我只得到了一个 APIPA 地址)。

    【讨论】:

    • 在我的本地机器上就像一个魅力,但如果我在我的 VM 上的 python 终端中运行它,它会给出:socket.gaierror: [Errno -2] Name or service not known。知道为什么吗?
    • 说实话,没有。但让我们试着简化一下。尝试分离 2 个函数调用。首先调用socket.gethostname(),确保它返回一个合法的值,然后使用该值调用socket.gethostbyname_ex()
    • socket.gethostname() -> 'virtual-158-3-250.xxx.xx', socket.gethostbyname_ex('virtual-158-3-250.xxx.xx') -> 未知,socket.gethostbyaddr('10.158.3.250') -> 未知,我只需要找到一种方法来检测virtual-158-3-250.xxx.xx是否与10.158.3.250相同。但是怎么做呢?
    • 这可能是主机文件配置错误的结果。在您的主机文件中,应该有一个将 127.0.0.1 映射到 localhost 的条目,以及一个将您的“真实”IP 地址映射到您的主机名 (10.158.3.250 virtual-158-3-250.xxx.xx) 的条目。如果您使用的是 Windows 计算机,则可以在“C:\Windows\System32\drivers\etc\hosts”中找到该文件。如果您在 Linux 机器上,该文件位于 /etc/hosts。
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多