如何在python中为接口分配IP地址?

Posted

技术标签:

【中文标题】如何在python中为接口分配IP地址?【英文标题】:How to assign IP address to interface in python? 【发布时间】:2013-12-23 15:06:27 【问题描述】:

我有一个 python 脚本,可以为我的无线和有线接口设置 IP4 地址。到目前为止,我使用subprocess 命令,例如:

subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"])

如何使用 python 库设置接口的 IP4 地址? 是否有任何方法可以使用 python 库获取已经存在的 IP 配置?

【问题讨论】:

拆分参数:call(shlex.split("ip addr add local...")) 否则你应该得到“没有这样的文件或目录”错误。 ***.com/questions/166506/… 更正这个:) call("ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0",shell=True) 不列出并添加shell跨度> 【参考方案1】:

使用pyroute2.IPRoute:

from pyroute2 import IPRoute
ip = IPRoute()
index = ip.link_lookup(ifname='em1')[0]
ip.addr('add', index, address='192.168.0.1', mask=24)
ip.close()

与pyroute2.IPDB:

from pyroute2 import IPDB
ip = IPDB()
with ip.interfaces.em1 as em1:
    em1.add_ip('192.168.0.1/24')
ip.release()

【讨论】:

也许添加披露您与此工具的关联? 我写它是为了使用,而不是为自己做广告:)) 但如果有人想知道,我相信这种关联应该是显而易见的。【参考方案2】:

通过旧的ioctl 接口设置地址:

import socket, struct, fcntl

SIOCSIFADDR = 0x8916
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


def setIpAddr(iface, ip):
    bin_ip = socket.inet_aton(ip)
    ifreq = struct.pack('16sH2s4s8s', iface, socket.AF_INET, '\x00' * 2, bin_ip, '\x00' * 8)
    fcntl.ioctl(sock, SIOCSIFADDR, ifreq)


setIpAddr('em1', '192.168.0.1')

(使用SIOCSIFNETMASK = 0x891C设置网络掩码)

IP地址可以用同样的方式获取:Finding local IP addresses using Python's stdlib

如果您想在ioctl 上使用它,我相信有一个 Netlink 的 python 实现

【讨论】:

非常感谢。这看起来很棒。我今晚会测试它。你知道我如何设置默认网关吗? 默认路由由目的地址0.0.0.0指定。您可以通过 ioctl 使用 SIOCADDRT (0x890B) 将路由添加到路由表。如果您要与网络接口进行大量交互,我可能会建议您熟悉 Netlink。【参考方案3】:

您有多种选择可以从您的 python 程序中执行此操作。

可以像您展示的那样使用ip 工具。虽然这根本不是最好的选择,但这通常可以完成这项工作,同时编程有点慢和难看。

另一种方法是通过直接使用内核 netlink 接口自行完成 ip 所做的事情。我知道libnl 有一些实验性(?)python 绑定。这可能有效,但您将不得不处理很多低级的东西。对于简单的“设置和获取”ip,我不推荐这种方式,但这是最“正确”和最可靠的方式。

在我看来(如果您只想设置和获取 ips)最好的方法是使用 NetworkManagers dbus 接口。虽然这是非常有限的并且可能有其自身的问题(它的行为可能不是您想要的方式),但如果 NetworkManager 仍然在运行,这是最直接的方式。

因此,如果您想亲自动手,请选择libnl 方法,它显然更胜一筹,但工作量也更大。根据您的需要和一般系统设置,您也可以使用 NetworkManager dbus 接口。否则你可以就这样离开它。

【讨论】:

使用网络管理器 dbus 可能是一个不错的方法,但我不使用网络管理器,我手动设置我的网络。 如果除了手动网络配置之外 NetworkManager 已启动并运行,您仍然可以使用它。但我对 API 的了解还不够,您必须自己深入研究。

以上是关于如何在python中为接口分配IP地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DockerFile 中为 H2 数据库定义 IP 地址

Python:获取linux中本地接口/ IP地址的默认网关

如何找到连接到服务器的客户端的 IP 地址?

如何将多个传出IP地址分配给AWS上的单个实例?

如何在VMware ESXi虚拟机上设置静态MAC地址

ip命令来配置网络接口卡的十种用法(很实用)