2024-05-20 20:45:47 发布
网友
我有一个python脚本,它为我的无线和有线接口设置了IP4地址。到目前为止,我使用subprocess命令,比如:
subprocess
subprocess.call(["ip addr add local 192.168.1.2/24 broadcast 192.168.1.255 dev wlan0"])
如何使用python库设置接口的IP4地址? 如果有什么方法可以使用python库获得已经存在的IP配置呢?
使用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工具。虽然这不是最好的选择,但通常情况下,这项工作做得有点慢,程序也有点难。
ip
另一种方法是通过直接使用内核netlink接口来完成ip自己所做的事情。我知道libnl有一些实验性的(?)python绑定。这可能管用,但你必须处理很多低级的事情。对于简单的“set-and-get”ips,我不推荐使用这种方法,但这是最“正确”和可靠的方法。
在我看来,最好的方法(如果您只想设置和获取ips)是使用NetworkManagers dbus接口。虽然这是非常有限的,并且可能有自己的问题(它的行为可能不像您希望的那样),但如果NetworkManager仍在运行,这是最直接的方法。
所以,如果你想弄脏你的手,选择libnl方法,它显然是更好的,但也可以做更多的工作。您还可以使用NetworkManager dbus接口,这取决于您的需要和一般的系统设置。否则你就只能这样了。
libnl
通过较旧的ioctl接口设置地址:
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设置网络掩码)
SIOCSIFNETMASK = 0x891C
Ip地址可以用同样的方式检索:Finding local IP addresses using Python's stdlib
我相信Netlink有一个python实现,如果您想在ioctl上使用它的话
使用pyroute2.IPRoute:
使用pyroute2.IPDB:
您可以从python程序中选择多个选项来执行此操作。
人们可以像你展示的那样使用
ip
工具。虽然这不是最好的选择,但通常情况下,这项工作做得有点慢,程序也有点难。另一种方法是通过直接使用内核netlink接口来完成
ip
自己所做的事情。我知道libnl有一些实验性的(?)python绑定。这可能管用,但你必须处理很多低级的事情。对于简单的“set-and-get”ips,我不推荐使用这种方法,但这是最“正确”和可靠的方法。在我看来,最好的方法(如果您只想设置和获取ips)是使用NetworkManagers dbus接口。虽然这是非常有限的,并且可能有自己的问题(它的行为可能不像您希望的那样),但如果NetworkManager仍在运行,这是最直接的方法。
所以,如果你想弄脏你的手,选择
libnl
方法,它显然是更好的,但也可以做更多的工作。您还可以使用NetworkManager dbus接口,这取决于您的需要和一般的系统设置。否则你就只能这样了。通过较旧的
ioctl
接口设置地址:(使用
SIOCSIFNETMASK = 0x891C
设置网络掩码)Ip地址可以用同样的方式检索:Finding local IP addresses using Python's stdlib
我相信Netlink有一个python实现,如果您想在
ioctl
上使用它的话相关问题 更多 >
编程相关推荐