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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在python中为接口分配IP地址?相关的知识,希望对你有一定的参考价值。

我有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配置?

答案

通过旧的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实现

另一答案

使用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()
另一答案

你可以从python程序中选择多个选项。

可以像你展示的那样使用ip工具。虽然这不是最好的选择,但这通常会让你的工作变得有点缓慢和笨拙。

另一种方法是直接使用内核netlink接口自己做ip所做的事情。我知道libnl有一些实验性(?)python绑定。这可能有用,但你必须处理很多低级别的东西。我不建议这种方式用于简单的“设置和获取”ips,但它是最“正确”和可靠的方式。

在我看来,最好的方法是(如果你只想设置和获取ips)将使用NetworkManagers dbus接口。虽然这是非常有限的并且可能有它自己的问题(它可能不是你希望的那样),但如果NetworkManager正在运行,这是最直接的方式。

所以,如果你想弄脏手,选择libnl方法,它显然是优越的,但也是更多的工作。您也可以使用NetworkManager dbus接口,具体取决于您的需求和一般系统设置。否则你可以这样离开。

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

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

在 Linux 上获取接口的 IP 地址

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

在C中为结构指针数组成员分配地址

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

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