当前位置: 首页 > 知识库问答 >
问题:

如何从Python中的NIC(网络接口控制器)获取IP地址?

岳正浩
2023-03-14

当Unix上的Python脚本出现错误时,会发送一封电子邮件。

如果IP地址192.168.100.37是测试服务器,我被要求将{测试环境}添加到电子邮件的主题行。这样我们就可以有一个版本的脚本和一种方法来判断电子邮件是否来自测试服务器上混乱的数据。

然而,当我在谷歌上搜索时,我一直在寻找以下代码:

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

然而,这给了我127.0.1.1的IP地址。当我使用ifconfig时,我得到了这个

eth0      Link encap:Ethernet  HWaddr 00:1c:c4:2c:c8:3e
          inet addr:192.168.100.37  Bcast:192.168.100.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:75760697 errors:0 dropped:411180 overruns:0 frame:0
          TX packets:23166399 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:59525958247 (59.5 GB)  TX bytes:10142130096 (10.1 GB)
          Interrupt:19 Memory:f0500000-f0520000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:25573544 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25573544 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:44531490070 (44.5 GB)  TX bytes:44531490070 (44.5 GB)

首先,我不知道它是从哪里127.0.1.1的,但不管怎样,这都不是我想要的。当我谷歌时,我总是使用相同的语法、Bash脚本或网络面孔,我试图使用标准库。

那么如何在Python中获取eth0的IP地址呢?

共有3个答案

李建中
2023-03-14

返回带有接口IP地址的字符串的简单方法是:

from subprocess import check_output

ips = check_output(['hostname', '--all-ip-addresses'])

有关详细信息,请参阅主机名。

洪星文
2023-03-14

或者,如果您想获取用于连接网络的任何接口的IP地址,而不必知道其名称,您可以使用:

import socket
def get_ip_address():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return s.getsockname()[0]

我知道这和你的问题有点不同,但是其他人可能会到达这里,发现这个更有用。你不需要有一个8.8.8.8的路由来使用这个。它所做的只是打开一个套接字,但不发送任何数据。

呼延渝
2023-03-14

两种方法:

您需要请求绑定到eth0接口的IP地址。这可以从netifaces软件包中获得

import netifaces as ni
ni.ifaddresses('eth0')
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print(ip)  # should print "192.168.100.37"

您还可以通过获取所有可用接口的列表

ni.interfaces()

下面是一种不用python包就能获取IP地址的方法

import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15])
    )[20:24])

get_ip_address('eth0')  # '192.168.0.110'

注意:检测IP地址以确定您正在使用的环境是一种相当大的攻击。几乎所有框架都提供了一种非常简单的方法来设置/修改环境变量,以指示当前环境。试着看看你的文档。它应该像做一样简单

if app.config['ENV'] == 'production':
  #send production email
else:
  #send development email
 类似资料:
  • 但是,这给了我127.0.1.1的IP地址。当我使用时,我得到以下信息 首先,我不知道127.0.1.1是从哪里来的,但不管怎样,这都不是我想要的。当我谷歌的时候,我总是看到相同的语法,Bash脚本或netifaces,我试图使用标准库。 那么如何在Python中获取eth0的IP地址呢?

  • 问题内容: 到目前为止,我使用PyQt类所做的事情: 输出: 使用: 输出: 有没有办法区分它们? 可以使用普通的Python代替PyQt类吗? 如何获得IPv6地址? 问题答案: 您应该使用netifaces。它被设计为跨平台的,并且包含Windows专用代码以及可在不同UNIX / UNIX类平台上工作的各种通用版本。 从netifaces版本0.10.0开始,支持Python3。 使用摘要

  • 问题内容: 看来android的java.net.NetworkInterface实现没有 byte [] getHardwareAddress()方法 http://developer.android.com/reference/java/net/NetworkInterface.html 我发现有几个论坛的人都试图这样做,但没有明确的答案,我需要获得一个跨设备的UUID,所以我不能依赖电话号码

  • 问题内容: 在Linux上,如何使用python查找本地IP地址/接口的默认网关? 我看到了“如何获取UPnP的内部IP,外部IP和默认网关”的问题,但是公认的解决方案仅显示了如何获取Windows网络接口的本地IP地址。 谢谢。 问题答案: 对于那些不想额外依赖并且不喜欢调用子流程的人,可以通过直接阅读以下内容来自己做: 我没有要测试的大端字节序计算机,因此我不确定字节序是否取决于您的处理器体系

  • 我的第一篇文章,所以请温柔一点;)我必须修改一些现有的专注于java.net.网络接口的软件。以前所有的接口都列在一个组合框中,用户必须选择一个。现在不仅可以选择接口,还可以选择这个接口附带的一个特定的ip地址。由于许多代码都是基于网络接口类的,我在想是否有可能通过将现有网络接口拆分为ip地址来“创建”一些新的网络接口。这可能吗?我知道,我不能创建一个新的网络接口。但是也许还有另一个选择,我现在看

  • 我希望在连接到wifi网络时,在运行我的应用程序的手机上获取用户的本地IPv4地址。使用以下代码: 我可以得到一些接近IPv4地址的信息,但与命令行中的IPv4地址相比,它并不完全相同。有更好的办法吗?我知道formatIpAddress已被弃用,但在我找到获取IPv4地址的方法之前,我暂时不太担心这个问题。 编辑: 我发现手机wifi设置中的ip地址是我在使用建议的解决方案获取ip地址时得到的。