如何在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 地址