【问题标题】:When oracle virtualbox are set, How to get local ip address in python设置oracle virtualbox时,如何在python中获取本地IP地址
【发布时间】:2015-11-11 05:25:11
【问题描述】:

--

我搜索了如何使用 python 获取我的本地 IP 地址。 (我的python版本是3.4)并且有答案。这个答案说:

import socket
socket.gethostbyname(socket.gethostname())

而且它有效。脚本说我的 IP 地址是 192.168.56.1 。但我的本地(=内部)IP 地址是 192.168.0.100 。

那么,那个IP地址是什么?这是我一周前设置 virtualbox 时安装的“Virtualbox Host-Only Network”的 IP 地址。 (Virtualbox的版本是5.0)我现在有2个网络适配器,一个是'Virtualbox Host-Only Network',另一个是局域网

当我在网络面板中关闭“Virtualbox Host-Only Network”时。 python脚本说我的IP地址是我想要的192.168.0.100。

无论是否禁用“Virtualbox Host-Only Network”,如何获取我的 IP 地址“192.168.0.100”? (我真的不想关闭“Virtualbox Host-Only Network”。)

【问题讨论】:

  • 你能发布 ifconfig 命令的输出吗? (Jhun 在回答中问了这个问题,因为
  • 感谢您的关注,并为我写开发接口的粗心感到抱歉。我正在使用 Windows 7,我的 ipconfig 说...“以太网适配器本地连接”是 192.168.0.100,“以太网适配器 VirtualBox Host-Only Network”是 192.168.56.1。

标签: python ip


【解决方案1】:

您可以使用名为 netifaces 的模块来获取您机器上可用的任何网络接口的 IP 地址。

如果您的系统上安装了 pip,您可以使用 pip 安装 netifaces

pip install netifaces

linux系统命令行示例:

我的机器在eth0 上有我的常规网络接口,在eth0:0 上有一个别名网络接口(这类似于您的virtualbox host-only 网络接口,但名称会不同。)

通过 python 解释器获取您机器上可用的网络接口列表:

(stackoverflow)[root@joeyoung.io stackoverflow]# python

>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0', 'eth0:0']

获取更多关于我的常规网络接口eth0的信息:

>>> netifaces.ifaddresses('eth0')
{17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '52:54:00:0d:4d:36'}], 2: [{'broadcast': '159.107.29.255', 'netmask': '255.255.254.0', 'addr': '159.107.28.65'}]}

我只对 Internet 协议地址系列感兴趣,所以让我们使用 AF_INET 作为过滤器来缩小结果范围:

>>> netifaces.ifaddresses('eth0')[netifaces.AF_INET]
[{'broadcast': '159.107.29.255', 'netmask': '255.255.254.0', 'addr': '159.107.28.65'}]

这给了我一个包含 1 个条目的列表。该条目包含一个字典。我想获取addr键所代表的值,以获取我的eth0接口的ip地址:

>>> netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']
'159.107.28.65'

159.107.28.65 是我的 eth0 接口的本地 IP 地址。

我们也可以执行上述相同的步骤来获取我在 eth0:0 上的别名 IP 地址:

>>> netifaces.ifaddresses('eth0:0')
{2: [{'broadcast': '192.168.13.255', 'netmask': '255.255.255.0', 'addr': '192.168.13.2'}]}
>>> netifaces.ifaddresses('eth0:0')[netifaces.AF_INET]
[{'broadcast': '192.168.13.255', 'netmask': '255.255.255.0', 'addr': '192.168.13.2'}]
>>> netifaces.ifaddresses('eth0:0')[netifaces.AF_INET][0]['addr']
'192.168.13.2'

【讨论】:

  • 谢谢你!问题已经解决了。正如你所建议的,我使用了 netifaces 模块,现在我可以获得我想要的网络信息。我在 Windows 7 中使用 python。所以“netifaces.interfaces()”的结果有所不同。在 Windows 中,结果集如下所示.. ['{F4D07299-32E8-4231-A089-41A269434941}', '{0B70EBE0-3A72-43A8-A4A4-8BB506A4F053}', '{846EE342-7039-11DE-9D20- 806E6F6E6963}', '{026BC1E3-1EB4-4D50-9253-CE0AFE398AAA}'] 它是一个字典类型。我可以参考如下。 netifaces.ifaddresses(netifaces.interfaces()[0])
【解决方案2】:

这个序列在 Linux 虚拟机上适用于我:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 53))
print s.getsockname()[0]

结果:

10.112.54.236

【讨论】:

  • 谢谢罗伯。我现在正在windows中开发。我不确定这是否是错误的原因,但是我已经尝试了您的代码并且它不起作用。在此之前,请原谅我写开发环境的粗心。
【解决方案3】:

让我记录下我所做的。
我使用 Oracle VirtualBox 从 Windows 10 主机运行 Linux VM。

  • 192.168.1.46 是 Windows 10 主机的 IP 地址,即 VM 主机。
  • 10.0.2.15 是用于访问 Internet 的 VM 的 IP 地址。这是由 Oracle VirtualBox 自动创建的。 NAT 用于在 Internet 和 VM 主机或 VM 之间转换 TCP/IP 消息。
  • 192.168.56.102192.168.56.1 是我手动创建仅主机适配器时 Oracle VirtualBox 创建的 IP 地址。我可以从 Windows 10 主机登录 Linux VM。

我使用psutil(Python 库)和ip(Linux 命令)来获取 IP 地址。

  1. 获取访问互联网的Windows 10主机的IP地址,

    python -c "import psutil as p; print(p.net_if_addrs()['Wi-Fi'][1].address)"
    

    您可能需要重命名接口名称(在我的情况下为“Wi-Fi”)

  2. 要获取访问 VM 的 Windows 10 主机的 IP 地址,

    python -c "import psutil as p; print(p.net_if_addrs()['VirtualBox Host-Only Network'][1].address)"
    

    您可能需要重命名接口名称(在我的情况下为“VirtualBox Host-Only Network”)

  3. 获取Linux VM的IP地址以访问Internet

    ip route get 8.8.8.8 | awk '{print $7}'
    
  4. 获取Linux VM的IP地址访问192.168.56.1

    ip route get 192.168.56.1 | awk '{print $5}'
    

【讨论】:

    猜你喜欢
    • 2021-01-28
    • 1970-01-01
    • 2023-03-18
    • 2014-06-26
    • 2012-05-31
    • 2019-02-09
    相关资源
    最近更新 更多