首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中为接口分配IP地址?

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

Stack Overflow用户
提问于 2013-12-06 17:56:04
回答 3查看 23.2K关注 0票数 10

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

代码语言:javascript
复制
subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"])

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-11 11:33:14

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

代码语言:javascript
复制
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实现

票数 8
EN

Stack Overflow用户

发布于 2015-02-17 23:28:39

使用pyroute2.IPRoute:

代码语言:javascript
复制
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:

代码语言:javascript
复制
from pyroute2 import IPDB
ip = IPDB()
with ip.interfaces.em1 as em1:
    em1.add_ip('192.168.0.1/24')
ip.release()
票数 17
EN

Stack Overflow用户

发布于 2013-12-06 18:56:52

在python程序中有多个选项可供选择。

您可以像您所展示的那样使用ip工具。虽然这不是最好的选择,但这通常会在编程时有点慢和arkward的情况下完成工作。

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

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

因此,如果你想亲自动手,选择libnl方法,它显然更好,但也有更多的工作要做。您也可以使用NetworkManager dbus接口,这取决于您的需要和一般系统设置。否则,您可以让它保持原样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20420937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档