如何使用Python查找当前连接(LAN或WiFi)的IP地址?

时间:2019-04-10 12:45:06

标签: python ip-address

我想知道系统的当前IP地址。到目前为止,我无法为我的设备找到任何解决方案。我已经尝试过socket.gethostbyname(socket.gethostname())的方法,但是它正在回报我127.0.0.1

是否有任何Python软件包可以在Ubuntu和Linux上正常运行?

2 个答案:

答案 0 :(得分:1)

请记住,您的系统可以在许多接口上具有多个 IP地址(尤其是在使用容器或虚拟机时,尤其如此),因此您需要明确说明< em>您想要的哪个IP地址。

此外,如果您的设备通过某种类型的NAT运行,则可能存在与您的设备相关联的外部地址,该地址在您的任何界面上都不可见。

因此,如果您的问题没有得到澄清,很难确切地知道您要查找的内容。出于此答案的目的,我假设您要“与默认路由关联的接口上的第一个IP地址”。我们可以使用netifaces模块来解决此问题:

首先,我们需要默认接口​​的名称。我们可以使用netifaces.gateways()方法来获取网关列表:

>>> import netifaces
>>> netifaces.gateways()
{'default': {2: (u'192.168.1.1', u'eth0')}, 2: [(u'192.168.1.1', u'eth0', True)]}

default键代表我们的默认网关,该键的值是一个字典,其中的键是地址族,因此要获取接口名称,我们需要:

>>> netifaces.gateways()['default'][netifaces.AF_INET][1]
u'eth0'

一旦有了默认接口的名称,就可以使用netifaces.interfaces()方法进行查找:

>>> iface = netifaces.gateways()['default'][netifaces.AF_INET][1]
>>> netifaces.ifaddresses(iface)
{17: [{'broadcast': u'ff:ff:ff:ff:ff:ff', 'addr': u'64:00:6a:7d:06:1a'}], 2: [{'broadcast': u'192.168.1.255', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.24'}, {'broadcast': u'192.168.1.100', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.100'}, {'broadcast': u'192.168.1.101', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.101'}], 10: [{'netmask': u'ffff:ffff:ffff:ffff::/64', 'addr': u'fe80::5da1:2401:a725:d2e0%eth0'}]}

这使我们获得了很多接口信息,这些信息再次由地址族输入。要获取接口的第一个IP地址:

>>> netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr']
u'192.168.1.24'

这可能就是您要寻找的值。

答案 1 :(得分:0)

您可以通过Python进行bash调用:

import os
os.system('ipconfig')

或带有子过程

cmd = 'ipconfig'
results = subprocess.run(
           cmd, shell=True, universal_newlines=True, check=True)
print(results.stdout)