当前位置: 首页 > news >正文

华为USG系列防火墙 RESTCONF NAT配置 Python实现

目录

前言

文档下载 

开启RESTCONF接口

Python 实现SNAT增删改查

查看nat映射列表

查看私网地址池

查看源地址池(公网)

查看nat映射规则

创建nat映射规则

创建私网地址池

创建源地址池

创建nat映射规则

修改NAT映射规则

删除NAT映射规则

补充


前言

一般的NAT规则要在Web界面或console控制台配置,都是手动的操作,想实现自动化或接入业务,可通过华为提供的RESTCONF接口实现。本文章适合有NAT基础的人群观看,主要讲解SNAT的自动化接口配置,补充部分也有一些NAT技术的资料参考。

文档下载 

先找到对应型号的RESTCONF文档,下面是官方链接。

华为 USG12000, USG9500, USG6000F, USG6000F-S, USG6000E, USG6000E-S, USG6000系列防火墙 | 配置手册、产品文档、PDF - 华为

开启RESTCONF接口

登录Web界面进行配置

Python 实现SNAT增删改查

创建一条NAT规则,需要配置源转换地址池(公网段),创建私网地址池(内网段),创建nat映射规则。代码上没有太多可讲的,注意参数的配置即可。特别删改操作,建议做鉴权功能,防止滥用,下面直接贴代码。

查看nat映射列表

代码只贴一份,替换下url即可,注意请求方式为GET

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  HOST = "xxx" #填自己的ip
USER = "xxx" 
PASSWD = "xxx"
vsys = "public"
name = "xxxx"class MyAdapter(HTTPAdapter):  def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  self.poolmanager = PoolManager(num_pools=connections,  maxsize=maxsize,  block=block,  ssl_version=ssl.PROTOCOL_TLSv1_2)url = f'https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}'  #查看私网地址
url = f'https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}'  #查看源地址池
url = f'https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={rule}'  #查看nat映射规则header = {  'Host': HOST,  'Accept': '*/*',
}  disable_warnings(InsecureRequestWarning) basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  r = s.get(url=url, headers=header, auth=basic, verify=False)  print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

三个查看点:

  1. 查看私网地址池
  2. 查看源地址
  3. 查看nat映射规则

查看私网地址池

  • 查看全部:GET  https://{HOST}/restconf/data/huawei-address-set:address-set
  • 查看具体:https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}GET 查看具体:https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}

一个地址组的格式形如下,<vsys>表示地址组名,<name>地址名,<elements>元素集,<elem-id>元素id,<address-ipv4>元素地址

<address-set>

<addr-object>

<vsys>public</vsys>

<name>xxx</name>

<elements>

<elem-id>0</elem-id>

<address-ipv4>10.10.10.1/24</address-ipv4>

</elements>

<elements><elem-id>1</elem-id>

<address-ipv4>10.10.10.2/24</address-ipv4>

</elements>

</addr-object>

</address-set>

查看源地址池(公网)

url

  • 查看全部 GET https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group
  • 查看某个 GET https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}

一个地址组的格式形如下,

<vsys>表示地址组名,<name>地址名,

<mode>表示地址类型(如全锥型、对称型、端口受限锥形、地址受限锥形),

<address-zone>地址区域(默认全局),

<no-reverse>配置不带no-reverse参数的nat server后,当公网用户访问服务器时,设备能将服务器的公网地址转换成私网地址;同时,当服务器主动访问公网时,设备也能将服务器的私网地址转换成公网地址配置参数no-reverse后,设备只将公网地址转换成私网地址,不能将私网地址转换成公网地址。当内部服务器主动访问外部网络时需要执行outbound的nat策略

<elements>元素集,<id>元素id,

<start-ip>起始地址,<end-ip>结束地址(注意可以是多个或一个,如开始210.50.46.123,结束210.50.46.123,则只有一个地址,否则可以连续,如210.50.46.123,210.50.46.250,地址从x.123-x.250

<nat-address-group>
<name>nat_ippool</name>
<vsys>public</vsys>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>

查看nat映射规则

url

  • 查看所有 GET https://{HOST}/restconf/data/huawei-nat-policy:nat-policy
  • 查看单个 GET  https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={rule}

<vsys><name> 表示地址组名,<name>地址名

<rule><name>规则名

<source-zone> 源地址区域 trust(信任区,一般为内网地址或端口) untrust(不守信区,一般为外网地址或端口)

<address-set> 对应私网地址池的<name>名

<enable> 是否打开 

<nat-address-group> 对应源地址池的<name>

<vsys>

<name>public</name>

<rule>

<name>xxx</name>

<source-zone>trust</source-zone>

<destination-zone>untrust</destination-zone>

<source-ip>

<address-set>10.10.10.1/24</address-set>

</source-ip>

<enable>true</enable>

<action>nat-address-group</action>

<nat-address-group>210.50.46.123</nat-address-group>

<nat-type>nat</nat-type>

</rule>

</vsys>

创建nat映射规则

注意:HTTP方法可以是POST、PUT或者PATCH,依次对应NETCONF协议中的create动作、replace动作和merge动作。如果是PUT方法,服务端如果已存在对应配置则会被直接覆盖为此次下发的内容。

建议不要使用PUT方法,可能会替换为目前已有规则,如果是POST,则会报重名的错误,避免了替换规则。

注:以下案例中得body内没有<name>,地址池或规则名称都嵌到URL请求链接中了

创建私网地址池

POST https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys},{name}

url请求中申明了地址池name,所以body中就无需添加了,基本格式如下,希望添加得地址放到<elem>中即可(默认id从0起)

<addr-object>
<elements>
<elem-id>0</elem-id>
<address-ipv4>10.10.10.1/24</address-ipv4>
</elements>
<elements>
<elem-id>1</elem-id>
<address-ipv4>10.10.10.2/24</address-ipv4>
</elements>
<elements>
</addr-object>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"class MyAdapter(HTTPAdapter):  def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  self.poolmanager = PoolManager(num_pools=connections,  maxsize=maxsize,  block=block,  ssl_version=ssl.PROTOCOL_TLSv1_2)url = f'https://{HOST}/restconf/data/huawei-address-set:address-set/addr-object={vsys },{name }'
header = {  'Host': HOST,  'Accept': '*/*',
}  body = """
<addr-object>
<elements>
<elem-id>0</elem-id>
<address-ipv4>10.10.10.1/24</address-ipv4>
</elements>
<elements>
<elem-id>1</elem-id>
<address-ipv4>10.10.10.2/24</address-ipv4>
</elements>
<elements>
</addr-object>
"""disable_warnings(InsecureRequestWarning) basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

调用成功返回201

创建源地址池

POST https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}}

一下默认开放了全部端口,地址范围是 210.50.46.123 -210.50.46.125 ,nat类型是全锥(三元组)

<nat-address-group>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"class MyAdapter(HTTPAdapter):  def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  self.poolmanager = PoolManager(num_pools=connections,  maxsize=maxsize,  block=block,  ssl_version=ssl.PROTOCOL_TLSv1_2)url = f'https://{HOST}/restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group={name},{vsys}'
header = {  'Host': HOST,  'Accept': '*/*',
}  body = """
<nat-address-group>
<mode>full-cone</mode>
<mode-pattern>
<address-zone>global</address-zone>
<no-reverse>false</no-reverse>
</mode-pattern>
<section>
<id>0</id>
<start-ip>210.50.46.123</start-ip>
<end-ip>210.50.46.125</end-ip>
</section>
</nat-address-group>
"""disable_warnings(InsecureRequestWarning) basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

创建nat映射规则

POST https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={name}

<address-set></address-set> 写私有地址池得<name>

<nat-address-group></nat-address-group>  写源地址池(公网)得<name>

<rule>
<source-zone>trust</source-zone>
<destination-zone>untrust</destination-zone>
<source-ip>
<address-set>private_add</address-set>
</source-ip>
<enable>true</enable>
<action>nat-address-group</action>
<nat-address-group>public_add</nat-address-group>
<nat-type>nat</nat-type>
</rule>

import ssl  
import requests  
from requests.adapters import HTTPAdapter, PoolManager  
from requests.auth import HTTPBasicAuth  
from urllib3.exceptions import InsecureRequestWarning  
from urllib3 import disable_warnings  HOST = "xxx"
USER = "xxx" 
PASSWD = "xxx"
vsys = "xxx"
name = "xxx"class MyAdapter(HTTPAdapter):  def init_poolmanager(self, connections, maxsize, block=False, **pool_kwargs):  self.poolmanager = PoolManager(num_pools=connections,  maxsize=maxsize,  block=block,  ssl_version=ssl.PROTOCOL_TLSv1_2)url = f'https://{HOST}/restconf/data/huawei-nat-policy:nat-policy/vsys={vsys}/rule={name}'
header = {  'Host': HOST,  'Accept': '*/*',
}  body = """
<rule>
<source-zone>trust</source-zone>
<destination-zone>untrust</destination-zone>
<source-ip>
<address-set>fortest</address-set>
</source-ip>
<enable>true</enable>
<action>nat-address-group</action>
<nat-address-group>justfortest</nat-address-group>
<nat-type>nat</nat-type>
</rule>
"""disable_warnings(InsecureRequestWarning) basic = HTTPBasicAuth(USER, PASSWD)  
s = requests.Session()  
s.mount('https://', MyAdapter())  r = s.post(url=url, headers=header, data=body, auth=basic, verify=False)  print(r.request.headers)  
print(r.status_code)  
print(r.text)  
s.close()

修改NAT映射规则

修改(如在原地址池得基础上加一个地址段),大致思路就是获取老的结构体,加入新得ip段并构造一个新的结构体,再使用PUT请求替换。华为原文档提供得方法是使用PUT请求覆盖,但覆盖前先得获取原本结构得信息,不建议用原文档得方式。

修改一条NAT规则,主要就是对私网地址池做修改,或对源地址池(公网)做修改,比如增加或删除一个地址段,参考代码如下(增加一个ip段)

代码流程思路:

  1. 获取对应名<name>得xml结构体
  2. 通过结构体获取ip列表
  3. 将新的ip加入到ip列表
  4. 重构结构体并上报
def build_new_request_body(ip_addresses,newip):"""模板<addr-object><elements><elem-id>0</elem-id><address-ipv4>10.10.10.1/32</address-ipv4></elements></addr-object>"""#构造老的地址fragments = ['<addr-object>']num=0for count, ip in enumerate(ip_addresses):elements = f"<elements><elem-id>{count}</elem-id><address-ipv4>{ip}</address-ipv4></elements>"fragments.append(elements)num+=1#加入新的instanceIPnew_instanceIP = f"<elements><elem-id>{num}</elem-id><address-ipv4>{newip}</address-ipv4></elements>"fragments.append(new_instanceIP)#拼接fragments.append("</addr-object>")addr_object = ''.join(fragments)return addr_object#构建新的请求体,获取现有地址列表
def get_request_body(existing_xml):try:        # 解析XMLroot = etree.fromstring(existing_xml)# 定义命名空间ns = {'ns0': 'urn:ietf:params:xml:ns:netconf:base:1.0','ns1': 'urn:huawei:params:xml:ns:yang:huawei-address-set'}# 查找所有<address-ipv4>元素ipv4_elements = root.findall('.//ns1:address-ipv4', ns) + root.findall('.//address-ipv4')# 提取IP地址ip_addresses = [elem.text for elem in ipv4_elements]logger.info("提取的IP地址:", ip_addresses)return ip_addressesexcept etree.XMLSyntaxError as e:logger.error(f"XML解析错误: {e}")except Exception as e:logger.error(f"发生错误: {e}")return Nonedef get_existing_addr_object(addName):vsys = "public"addr_object_url = f"{base_url}/data/huawei-address-set:address-set/addr-object={vsys},{addName}"response = requests.get(addr_object_url, headers=headers, auth=HTTPBasicAuth(username, password), verify=False)logger.info(response)if response.status_code == 200:return response.textelse:raise Exception(f"Failed to get address object: {response.status_code}, {response.text}")def addInstanceIP(addName,newip):# 获取现有XML数据existing_xml = get_existing_addr_object(addName)ip_addresses = get_request_body(existing_xml)# 构造新的add结构addr_object = build_new_request_body(ip_addresses,newip)# 请求防火墙status_code = send_restconf_request(addName,addr_object)return status_codeaddInstanceIP("fortest","10.10.10.1/24")

删除NAT映射规则

删除规则比较简单,调用DELETE进行删除即可,分为全部和单个

  • 删除所有 DELETE /restconf/data/huawei-nat-address-group:nat-address-group
  • 删除某个 DELETE /restconf/data/huawei-nat-address-group:nat-address-group/nat-address-group=test,public

修改和删除得逻辑相似,都不建议直接调用原生接口,因为大多数得时候并不希望删除整个规则,而是希望删除某个具体得地址段,可以参考修改NAT映射规则,加一个地址判断逻辑,在构造新的结构体时不加入新段即可。

def build_new_request_body(ip_addresses,deleteIP):"""模板<addr-object><elements><elem-id>0</elem-id><address-ipv4>10.10.10.1/32</address-ipv4></elements></addr-object>"""#构造老的地址fragments = ['<addr-object>']num=0for count, ip in enumerate(ip_addresses):if not deleteIP:elements = f"<elements><elem-id>{count}</elem-id><address-ipv4>{ip}</address-ipv4></elements>"fragments.append(elements)num+=1#拼接fragments.append("</addr-object>")addr_object = ''.join(fragments)return addr_object

补充

网络技术:NAT 网络地址转换 - 乌漆WhiteMoon - 博客园

NAT(网络地址转换) - eiSouthBoy - 博客园

42张图详解 NAT : 换个马甲就能上网-腾讯云开发者社区-腾讯云

网络地址转换:DNAT和SNAT有啥区别?分别用于什么场景?-腾讯云开发者社区-腾讯云

相关文章:

华为USG系列防火墙 RESTCONF NAT配置 Python实现

目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池&#xff08;公网&#xff09; 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …...

qemu安装arm64架构银河麒麟

qemu虚拟化软件&#xff0c;可以在一个平台上模拟另一个硬件平台&#xff0c;可以支持多种处理器架构。 一、安装 安装教程&#xff1a;https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接&#xff1a;https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...

深入解析 Spring 框架:核心特性与应用价值

1.什么是spring? Spring 是一个开源的 Java 应用框架&#xff0c;由 Pivotal Software 提供支持。它为开发基于 Java 的企业级应用提供了一整套基础设施支持。Spring 框架的核心功能是依赖注入&#xff08;Dependency Injection, DI&#xff09;&#xff0c;它帮助开发者实现…...

protobuf 报文编解码工具

QT实现的 protobuf 反序列化 & 序列化工具&#xff0c;版本号V1.2 下载链接&#xff1a;protobuf报文编解码工具资源-CSDN文库 源码github&#xff1a;ProtobufTool 使用说明: 1. 点击“加载proto文件”按钮&#xff0c;从本地选择 .proto文件 2. 选择消息名称&#xff…...

Milvus向量数据库06-RAG检索增强

Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程&#xff1a;为什么 RAG 优于传统的基于检索的方法&#xff1a;示例流程&#xff1a; 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者&#xff0c;希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务&#xff0c;然后低延迟播放出来。简单来说&#xff0c;在Unity 中实现采集 Camera 场景并推送RTMP的话&#xff0c;先是获取 Camera 场景数据&#xff0c;通过创建 RenderTe…...

标记数据集生成模型助力无数据情况下的大模型指令微调

在构建大模型应用时&#xff0c;通常有两种方式来改进效果&#xff0c;一种是构建外部知识库&#xff0c;利用RAG来完成。但RAG并不是万能的&#xff0c;对于特定领域的LLM应用&#xff0c;以及无需示例&#xff0c;就能完成特定任务等场合就需要进行微调。然而&#xff0c;微调…...

第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展

第六届知交会暨地博会&#xff1a;世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日&#xff0c;第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...

vue响应式原理

对于响应式原理&#xff0c;我们先了解vue是一个MVVM结构的框架&#xff1b;也就是数据层、视图层、数据-视图层&#xff1b;响应式的原理就是实现当数据更新时&#xff0c;视图层也要相应的更新&#xff0c;基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…...

使用Allure作为测试报告生成器(Java+Selenium)

背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时&#xff0c;当需要确认UI regression issue还是selenium test case自身的问题&#xff0c;需要去jenkins中查log&#xff0c;一般得到的是“Can not find element xxx…...

【论文阅读】处理器芯片敏捷设计方法:问题与挑战

作者&#xff1a;包云岗老师 包云岗老师是计算机体系结构方向的大牛&#xff0c;推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会&#xff1a; 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...

系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)

使用原始套接字发送了一个 SYN 数据包后&#xff0c;对方发送了 SYN,ACK 数据包&#xff0c;但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接&#xff1a; 即使你使用了原始套接字来发送和接收数据包&#x…...

VLDB 2024 | 时空数据(Spatial-temporal)论文总结

VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据&#xff08;time series data&#xff09;的相关论文&#xff0c;主要包含如有疏漏&#xff0c;欢迎大家补充。 &#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xf…...

以ATTCK为例构建网络安全知识图

ATT&CK&#xff08;Adversarial Tactics, Techniques, and Common Knowledge &#xff09;是一个攻击行为知识库和模型&#xff0c;主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念&#xff0c;并探讨通过ATT&a…...

Qt初识_对象树

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 什么是对象树 为什么要引…...

规范秩相关信息搜集Day2

系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…...

交换瓶子(图论 贪心)

1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点&#xff0c;从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式&#xff0c;我们就可以连出n条边 观察可以发现这些图有特点&#xff1a; n个点 连成n条边 因为每个点会指向它应该在的位置的那个点&#xff…...

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…...

Mac电脑钓鱼到拿下核心权限

目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…...

docker 架构详解

Docker架构是基于客户端-服务器&#xff08;C/S&#xff09;模式的&#xff0c;包含多个关键组件&#xff0c;以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析&#xff1a; Docker 架构概述 Docker 架构采用客户端-服务器&#xff08;C/S&#xff09;…...

05-标准库开发-STM32-IIC协议

七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC)&#xff0c;也常称为I2C&#xff08;I squared C&#xff09;&#xff0c;是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上&#xff0c;如MPU6050姿态传感器、OLED显示屏、存…...

vue 封装全局过滤器

1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...

【PlantUML系列】流程图(四)

目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字&#xff1b;结束一般使用stop/end关键字。基础用法包括&#xff1a; start ... stopstart ...…...

MATLAB中的合并分类数组

目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A&#xff0c;其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...

流编辑器sed(stream editor)

一.sed简介 sed是一种流编辑器&#xff0c;处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为模式空间&#xff0c;接着用sed命令处 理缓冲区中的内容&#xff0c;处理完成后&#xff0c;把缓冲区的内容送往屏幕。接着处理下一行&#xff0c;这样不断重复&…...

R语言的数据结构--矩阵

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组&#xff0c;矩阵中的元素都具有相…...

使用 Python 爬取某网站简历模板(bs4/lxml+协程)

使用 Python 爬取站长素材简历模板 简介 在本教程中&#xff0c;我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分&#xff1a;第一部分是使用BeautifulSoup的方法&am…...

19 go语言(golang) - 通过反射手动实现json序列化

一、json 在 Go 语言中&#xff0c;JSON 序列化和反序列化通常通过标准库 encoding/json 来实现。这个包提供了简单易用的接口来将 Go 数据结构转换为 JSON 格式字符串&#xff08;序列化&#xff09;&#xff0c;以及从 JSON 字符串解析出 Go 数据结构&#xff08;反序列化&a…...

Scala:隐式转换

隐式转换的定义 //隐式转换&#xff1a;编译器自动滴&#xff0c;偷偷滴&#xff0c;把数据A->B object test04 {def main(args: Array[String]): Unit {val i:Int1//把Int类型&#xff0c;转化成Double类型//Int -> Double//隐式转换失败val b:Double1//隐式转换失败v…...

UVM之寄存器模型生成

1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 &#xff08;1&#xff09;首先通过openpyxl读取EXCEL表格&#xff0c; workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 &#xff08;2&#xff…...

PL/SQL批量生成数据

在PL/SQL中生成大量模拟数据&#xff0c;特别是当你需要生成大量记录&#xff08;如1亿条&#xff09;时&#xff0c;有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践&#xff1a; 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...

Xcode模拟器运行报错:The request was denied by service delegate

Xcode模拟器运行报错&#xff1a;The request was denied by service delegate 造成的原因: &#xff08;1&#xff09;新的苹果M系列芯片的Mac电脑 &#xff08;2&#xff09;此电脑首次安装启动Xcode的应用程序 &#xff08;3&#xff09;此电脑未安装Rosetta 2 解决方法: …...

2024小迪安全基础入门第十课

目录 一、传输格式&数据-类型&编码&算法 1. 传输格式&#xff1a; 2. 传输数据&#xff1a; 3. 影响与渗透测试&#xff1a; #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储&#xff1a; 2. 密码存储的影响&#xff1a; 3.…...

Redisson分布式限流器

Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流&#xff0c;调研的限流框架大概有&#xff1a; 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...

xvisor调试记录

Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks

文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

???欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...

家庭路由器跑PCND的优点

在当今数字化的时代&#xff0c;PCDN&#xff08;Peer-to-Peer Content Delivery Network&#xff09;技术逐渐走入人们的视野&#xff0c;有人考虑在家庭路由器上跑PCDN&#xff0c;下面是优点&#xff1a; 1.资源利用最大化 家庭网络在很多时候存在闲置的带宽和计算资源。通…...

ASP.NET Core API + MySql

环境 数据库&#xff1a; mysql8.0 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…...

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一种学习率调度器&#xff0c;主要用于在模型训练过程中根据某些指标&#xff08;如验证损失&#xff09;动态调整学习率。它是一种基于性能指标动态调整学习率的策略&#xff0c;而不是预定义的固定时间调整。 主要…...

Dubbo

官方文档&#xff1a; Java SDK 手册 | Apache Dubbo 一 RPC及Dubbo 1 什么是RPC dubbo是⼀款⾼性能的rpc框架。什么是rpc呢&#xff1f; rpc是⼀种协议&#xff1a;是⼀种远程过程调⽤&#xff08;remote procudure call&#xff09;协议 rpc协议是在应⽤层之上的协议&…...

算法1(蓝桥杯18)-删除链表的倒数第 N 个节点

问题&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头节点。 输入&#xff1a;head 1 -> 2 -> 3 -> 4 -> 5 -> null, n 2 输出&#xff1a;1 -> 2 -> 3 -> 5 -> null输入&#xff1a;head 1 ->…...

SEC_ASA 第一天作业

拓扑&#xff1a; 实验需求&#xff1a; 注意&#xff1a;在开始作业之前必须先读“前言”&#xff0c;以免踩坑&#xff01;&#xff01;&#xff01;&#xff08;☞敢点我试试&#xff09; 按照拓扑图配置VLAN连接。 注意&#xff1a;ASA防火墙的 Gi0/1口需要起子接口&#x…...

《C语言程序设计现代方法》note-8 指针和数组的关系

文章目录 助记提要12章 指针和数组12.1 指针的算术运算12.2 指针用于数组处理结合使用*和运算符 12.3 数组名作为指针数组名可以用作指针指针也可以当做数组名数组型实参 12.4 指针和多维数组处理每个元素处理行处理列多维数组名做指针 12.5 指针和变长数组 助记提要 指针支持…...

安科瑞电能质量治理产品在分布式光伏电站的应用-安科瑞黄安南

1.概述 随着全球对可再生能源需求的增加&#xff0c;分布式光伏电站的建设和发展迅速。然而&#xff0c;分布式光伏电站的运行过程中面临着一系列问题&#xff0c;比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率&#xff0c;还会对…...

JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异主要体现在 Vue 如何追踪数组的变化&#xff0c;以及 Vue 如何处理数组…...

项目组件框架介绍[bRPC]

文章目录 前言bRPC安装bRPC的简单使用protobuf简单使用Echo服务远程调用Echo服务 与etcd关联 前言 bRPC是百度开源的一款工业级RPC框架&#xff0c;功能强大, 常用于搜索、存储、机器学习、广告、推荐等高性能系统。 bRPC安装 使用源码安装即可, 在安装前要确认依赖 sudo apt…...