机器有多个网卡时检测真实IP地址

时间:2019-05-15 07:01:51

标签: python sockets

我尝试使用此命令:

name = socket.gethostname()
address_info = socket.gethostbyname(name)

但这会返回IP地址169.x.x.x而不是我的真实地址(192.168.x.x),那是因为我的机器有几张network卡。

如何检测我的真实IP地址?

4 个答案:

答案 0 :(得分:1)

您可以使用netifaces。它将使您的任务变得更简单

import netifaces
netifaces.interfaces()

输出将是所有接口的列表

['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']

您可以像这样进一步深入研究-

netifaces.ifaddresses('en0')

输出应为-

{18: [{'addr': '00:12:34:56:78:9a'}], 2: [{'broadcast':
 '10.255.255.255', 'netmask': '255.0.0.0', 'addr': '10.16.1.4'}],
 30: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr':
 'fe80::123:4567:89ab:cdef%en0'}]}

查找接口地址

netifaces.ifaddresses('en0')[netifaces.AF_LINK]

输出

[{'addr': '00:12:34:56:78:9a'}]

您可以遍历所有接口并检索IP地址,例如-

for interface in netifaces.interfaces():
...   for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
...     print link['addr']

答案 1 :(得分:1)

您可以使用netifaces软件包:Doc

您对“真实”地址的含义感到困惑,所有网络接口都有权使用一个或多个IP地址,并且它们是真实的。

但是,如果您要选择一个可以将您连接到互联网的特定IP地址,那么您可以选择该接口并获取其主要IP地址。

也许这段代码会有所帮助:

import netifaces

def main():
    for item in netifaces.interfaces():
        print(netifaces.ifaddresses(item))
        print("\n")

if __name__== "__main__":
    main()

如果您想了解面向外部网络的接口,请使用以下代码:

print(netifaces.gateways()['default'][netifaces.AF_INET][0])

答案 2 :(得分:0)

也许您可以通过这种方式解决问题。

import socket

def my_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.connect(('stackoverflow.com', 1027))
    except socket.error:
        return None
    return s.getsockname()[0]

答案 3 :(得分:0)

这对您有用吗?

from pyroute2 import IPRoute

with IPRoute() as ipr:
    op = ipr.route('get', dst='8.8.8.8') #Find route to the google dns server
    for tup in op[0]['attrs']:
        if tup[0] == 'RTA_PREFSRC': # Preferred source address will be your ip address
            print(tup[1])