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

2024-05-20 20:45:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: dev命令ip脚本add地址localcall
3条回答

使用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绑定。这可能管用,但你必须处理很多低级的事情。对于简单的“set-and-get”ips,我不推荐使用这种方法,但这是最“正确”和可靠的方法。

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

所以,如果你想弄脏你的手,选择libnl方法,它显然是更好的,但也可以做更多的工作。您还可以使用NetworkManager dbus接口,这取决于您的需要和一般的系统设置。否则你就只能这样了。

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

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

相关问题 更多 >