Python网络自动化运维---SSH模块
目录
SSH建立过程
实验环境准备
一.SSH模块
1.1.Paramiko模块
1.1.1实验代码
1.1.2代码分段讲解
1.1.3代码运行过程
1.2Netmiko模块
Netmiko模块对比paramiko模块的改进:
1.2.1实验代码
1.2.2代码分段讲解
1.2.3代码运行过程
二.Paramiko模块和Netmiko模块常用函数总结
Paramiko模块
Netmiko模块
前言
本章主要介绍Python中的SSH模块和框架在网络运维中的具体应用,所有实验均针对华为设备,在ensp模拟器上演示。
SSH建立过程
详细了解SSH服务,请点击此处
抓包结果如下:
加密算法协商阶段
抓包结果如下:
密钥交换阶段 :
点击此处详细了解DH算法
客户端发送DH密钥
服务端发送DH公钥
实验环境准备
拓扑图:
基础配置
- 路由器配置各接口IP
- 本地电脑(Cloud模块)能够ping通路由器GE0/0/0接口的IP:192.168.223.10
- 路由器开启SSH服务,并在本地电脑使用远程工具(如:XShell)成功连接
一.SSH模块
Python中主要支持SSH协议实现远程连接设备的模块主要有Paramiko和Netmiko两种。
1.1.Paramiko模块
Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,但有时候会增加额外开销,如内置主动延迟等,因此,多掌握些朴素的Paramiko模块,则Python自动化实施起来更加灵活。
下面我们使用Paramiko模块来完成上面的拓扑实验来登录路由器并为他的loopback1端口配置IP地址1.1.1.1/32。
Paramiko模块是一个第三方模块,需要手动安装,我使用的Python IDE工具Pycharm自动安装,如下图,鼠标放在未安装的模块下方红色波浪线处,自动弹出安装界面。
1.1.1实验代码
import paramiko
import timeip = "192.168.223.10"
username = "zt"
password = "329161"
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip,username=username,password=password)print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
ssh_client.close()
1.1.2代码分段讲解
模块导入部分
import paramiko
import time
变量初始化部分
ip = "192.168.223.10"
username = "zt"
password = "329161"
SSH客户端创建与连接部分
ssh_client = paramiko.SSHClient()
- 调用Paramiko的SSHClient()方法创建一个SSH客户端,将其赋值给变量ssh_client。顾名思义,将本地电脑作为SSH客户端,而SSH服务端则是我们要登录的路由器。
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- 在默认情况下,Paramiko会拒绝任何未知的SSH公钥(DH共享密钥),这里我们需要使用上面的代码让Paramiko接受SSH服务端提供的公钥,这是任何时候使用Paramiko都要用到的标准配置。
ssh_client.connect(hostname=ip,username=username,password=password)
- 做完Paramiko关于SSH公钥的配置,调用Paramiko.SSHClient的conect()函数进行SSH登录
print("Successfully connected to ",ip)
commend = ssh_client.invoke_shell()
- SSH连接成功后,需要调用Paramiko.SSHClient()的invoke_shell()方法来唤醒华为设备的命令行,并将其复制给commend
commend.send("sys\n")
commend.send("int loop 1\n")
commend.send("ip address 1.1.1.1 255.255.255.255\n")
commend.send("return\n")
commend.send("save\n")
commend.send("Y\n")
- 之后调用invoke_shell()的send()函数来向路由器“发送命令”,这里需要注意“\n”代表我们每次输入完命令后的回车执行过程。
time.sleep(2)
output = commend.recv(65535)
print (output.decode("ascii"))
- Python是一次性执行完所有脚本中的命令,中间没有间隔时间,这样会导致某些命令遗漏和回显内容不完整的问题,因此需要使用time模块中的sleep函数让Python休眠2s。
- 这里的 commend.recv(65535)代表截取65535个字符回显内容,即Paramiko一次能截取的最大回显内容,Paramiko截取的回显内容为字节型字符串,需要使用decode("ascii")将其解码为ACCII编码。
1.1.3代码运行过程
实验结果:
1.2Netmiko模块
Netmiko模块是基于Paramiko模块的二次开发。一般来说,Netmiko对用户比较友好,容易上手,下面我们使用Netmiko模块来完成上面的拓扑实验来登录路由器并为他的loopback2端口配置IP地址2.2.2.2/32。
Netmiko模块是第三方模块,需手动安装,安装方法和Paramiko模块一致,此处不再赘述。
Netmiko模块对比paramiko模块的改进:
对不同厂商设备支持方面:
- paramiko 是一个通用的 SSH 库,它主要提供了基本的 SSH 连接和命令执行功能。
- netmiko 内置了对多种网络设备厂商(如 Cisco、Juniper、Huawei 等)的支持,在函数
ConnectHandler
中通过device_type
可以自动使用相应厂商的命令配置逻辑,无需担心不同厂商设备在命令语法、提示符等方面的差异。
设备连接方面:
- 在使用 paramiko 时,需要手动设置
SSHClient
对象,设置主机密钥策略,然后通过connect
方法进行连接。 - netmiko 使用
ConnectHandler
函数,通过一个包含设备信息的字典作为参数进行连接,更加简洁和直观。device_type
可以帮助 netmiko 针对不同厂商的设备使用不同的驱动,方便对不同厂商设备的操作。
命令配置发送方面
- 使用 paramiko 发送多条配置命令时,需要手动调用
send
方法发送每条命令且命令后必须添加'''\n'参数来使python模拟回车操作。 - netmiko 的
send_config_set
方法可以接收一个命令列表,将这些命令按顺序发送到设备上,并自动处理命令的输入确认即回车。 - netmiko 内置不同厂商的驱动程序,这些程序包含了不同厂商设备的操作逻辑,包括如何进入和退出配置模式。例如对于华为设备,netmiko 会自动发送
quit
或return
等命令(根据具体情况),让设备从系统视图回到用户视图,而不需要用户手动添加这些命令。
结果处理方面
- 在 paramiko 中,需要使用
recv
方法接收数据,且需要手动指定接收的字节数,还需要使用decode
方法进行解码,同时使用time.sleep
来等待设备处理,防止Python一次性执行完所有脚本中的命令,中间没有间隔时间,导致某些命令遗漏 - netmiko 的
send_config_set
方法会自动等待命令执行完成并返回执行结果,无需手动处理等待和接收字节的问题,结果处理更加方便和高效。
1.2.1实验代码
import netmiko
R1 = {'device_type': 'huawei','ip': '192.168.223.10','username': 'zt','password': '329161'
}ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)save_output = ssh_client.send_command_timing('save')
#上述代码也可用下面的代码替代
#output = ssh_client.send_command('save', expect_string='Are you sure to continue')
if "Are you sure to continue" in save_output:confirm_output = ssh_client.send_command_timing("yes")print(confirm_output)print("Successfully to save config...")
ssh_client.disconnect()
1.2.2代码分段讲解
import netmiko
- 导入
netmiko
库,以便使用其功能
R1 = {'device_type': 'huawei','ip': '192.168.223.10','username': 'zt','password': '1234'
}
- 创建一个包含设备信息的字典,其中
device_type
表示设备类型,ip
是设备的 IP 地址,username
和password
是登录凭证
ssh_client = netmiko.ConnectHandler(**R1)
print("Successfully connected to " + R1['ip'])
- 使用
ConnectHandler
函数建立与设备的连接,**R1
是将字典中的键值对作为关键字参数传递,并打印连接成功的消息
config_commands = ['interface Loopback2', 'ip address 2.2.2.2 255.255.255.255']
output = ssh_client.send_config_set(config_commands)
print(output)
- 创建一个名为config_commands的列表,其元素为需要在交换机上依次执行的命令
- 然后以刚创建的命令列表为参数,调用ConnectHandler()的send_config_set()函数来使用命令列表中的命令对设备做配置,并将配置过程打印出来
注:除了我们代码里写的命令,send_config_set函数额外替我们输入了 2个命令,一个是"system-view",一个是“return”,详情查看下方代码配置过程图片
save_output = ssh_client.send_command_timing('save', read_timeout=30)
print(save_output)if "Are you sure to continue" in save_output:confirm_output = ssh_client.send_command_timing("yes", read_timeout=30)print(confirm_output)
- 使用
send_command_timing
方法发送save
命令,read_timeout
参数设置读取超时时间为 30 秒,存储输出结果。 - 检查
save
命令的输出中是否包含确认信息,如果包含确认信息,发送yes命令保存配置
注意:使用save命令保存配置时,由于send_config_set函数会发送system-view命令从而自动进入系统视图,而save命令在系统视图下无法使用,因此需使用send_command_timing函数进行异步发送save命令保存配置。
1.2.3代码运行过程
实验结果:
二.Paramiko模块和Netmiko模块常用函数总结
Paramiko模块
创建SSH客户端
paramiko.SSHClient()创建SSH连接
paramiko.SSHClient.connect()必要参数:hostname,ip,username,password打开设备的命令行界面
paramiko.SSHClient.invoke_shell()向对端设备发送命令
paramiko.SSHClient.invoke_shell.send()设备客户端paramiko模块能够接受的最大字节数
paramiko.SSHClient.recv(65535)自动接受SSH服务端的公钥
paramiko.SSHClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
Netmiko模块
创建一个SSH客户端连接,函数中的参数为SSH服务端的主机名/IP/账户/密码等信息
netmiko.ConnectHandler(**R1)向SSH服务端发送一组配置命令,其参数为命令列表
netmiko.ConnectHandler.send_config_set()向SSH服务端发送单个配置命令,适用于需要交互的命令,因为它会自动根据设备的输出提示符来判断命令是否执行完成。
netmiko.ConnectHandler.send_command_timing
总结
相关文章:
Python网络自动化运维---SSH模块
目录 SSH建立过程 实验环境准备 一.SSH模块 1.1.Paramiko模块 1.1.1实验代码 1.1.2代码分段讲解 1.1.3代码运行过程 1.2Netmiko模块 Netmiko模块对比paramiko模块的改进: 1.2.1实验代码 1.2.2代码分段讲解 1.2.3代码运行过程 二.Paramiko模块和Ne…...
Failed to restart nginx.service Unit nginx.service not found
当你遇到 Failed to restart nginx.service: Unit nginx.service not found 错误时,这意味着系统无法找到 Nginx 的服务单元文件。这通常是因为 Nginx 没有通过 systemd 管理,或者 Nginx 没有正确安装。 解决方法 1. 检查 Nginx 是否正确安装 首先&am…...
学习记录之原型,原型链
构造函数创建对象 Person和普通函数没有区别,之所以是构造函数在于它是通过new关键字调用的,p就是通过构造函数Person创建的实列对象 function Person(age, name) {this.age age;this.name name;}let p new Person(18, 张三);prototype prototype n…...
【Redis】5种基础数据结构介绍及应用
考察频率难度60%⭐⭐ 这个方向的问题也是非常基础的,所以一般不会直接被当做一个单独的问题。常见的形式是结合你简历上的项目或者场景题来提问,即实际应用场景、是否可以优化、如何选择等。 由于场景题和实际项目差异较大,所以本文就只做基…...
基于GRU实现股价多变量时间序列预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...
Java Web开发高级——Spring Boot与Docker容器化部署
随着云计算和微服务架构的快速发展,容器化已成为现代应用部署的重要手段。Docker作为最受欢迎的容器化技术之一,使得开发者能够将应用及其所有依赖打包到一个可移植的容器中,简化了开发、测试、部署和运维的流程。本篇文章将通过以下内容讲解…...
计算机网络——网络层
重点内容: (1) 虚拟互连网络的概念。 (2) IP 地址与物理地址的关系。 (3) 传统的分类的 IP 地址(包括子网掩码)和无分类域间路由选择 CIDR 。 (4) 路由选择协议的工作原理。 目录 重点内容: 一.网络层提供的两种服务 二…...
每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式
打开 HBuilderX,点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件: 参考地址:Chrome插件 - B站下载助手(轻松下载bilibili哔哩哔哩视频)…...
cesium绕点旋转
绕点旋转的原理可以理解为相机一直看向一个点,不断改变相机的位置 let position Cesium.Cartesian3.fromDegrees(longitude, latitude) let lookAtTimer setInterval(() > {let heading viewer.camera.heading;let pitch viewer.camera.pitch;if (heading &…...
JavaScript系列(36)--微服务架构详解
JavaScript微服务架构详解 🏗️ 今天,让我们深入了解JavaScript的微服务架构,这是构建大规模分布式系统的关键技术。 微服务基础概念 🌟 💡 小知识:微服务架构是一种将应用程序构建为一组小型服务的方法&…...
神经网络基础 | 给定条件下推导对应的卷积层参数
神经网络基础 | 给定条件下推导对应的卷积层参数 按照 PyTorch 文档中 给定的设置: H o u t ⌊ H i n 2 padding [ 0 ] − dilation [ 0 ] ( kernel_size [ 0 ] − 1 ) − 1 stride [ 0 ] 1 ⌋ H_{out} \left\lfloor\frac{H_{in} 2 \times \text{padding}[0]…...
面向CTF的python_requests库的学习笔记
看师傅们写的各种脚本羡慕不已,自己却只会一点一点手搓,于是来做个笔记 requests库是干嘛的? 顾名思义,request就是请求,可以用来向服务器发送请求。它可以代替你在网站上发送请求报文,并接受回应报文。简…...
MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
近日,以“构建‘中试’生态,赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节,成都元来云志科技有限…...
Papers with Code:从代码索引到AI创新引擎
标题:Papers with Code:从代码索引到AI创新引擎 文章信息摘要: Papers with Code从解决机器学习论文代码复现的特定需求起步,通过建立全面的ML资源库和首个系统性leaderboard系统,快速积累了大量用户基础。被Meta收购…...
FastExcel 新一代的潮流 (EasyExcel)
目录 简介 FastExcel的特点 FastExcel使用方法详解 创建实体类和监听器 实现写入和读取功能 Excel转换为PDF 小结 FastExcel与EasyExcel的区别 结论 简介 FastExcel是由原EasyExcel作者在阿里巴巴宣布停止维护EasyExcel之后推出的升级版框架。它继承了EasyExcel的所有…...
Linux静态库与动态库的理解
Linux静态库与动态库的理解 一、静态库如何创建和使用静态库 二、动态库如何创建和使用动态库 三、静态库与动态库的关键区别四、总结 在 Linux 编程中,静态库和动态库是非常重要的概念 一、静态库 静态库是将多个目标文件(.o 文件)打包成一…...
mongoose 支持https踩坑纪实
简述 mongoose是C编写的嵌入式web服务,它能够支持https协议,可以简单的部署,但要做到完美部署,不是那么容易。 部署方法 本人使用的是最新的7.16版,以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…...
人工智能之数学基础:线性表达和线性组合
本文重点 线性表达和线性组合作为线性代数的核心概念,不仅深刻揭示了向量空间的基本性质,也为解决复杂问题提供了直观而有效的方法。 向量组 要想学习线性表达和线性组合,先来理解向量组。在线性代数中,向量组是指由若干个向量构成的集合。这些向量可以是二维的、三维的…...
uniapp——App 监听下载文件状态,打开文件(三)
5 实现下载文件并打开 这里演示,导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0? 相关Api: downloader DEMO 提示: 请求方式支持:GET、POST;POST 方式需要…...
Microsoft SQL Serve的下载与安装
1.访问Microsoft SQL Serve官网 SQL Server 下载 | Microsoft开始使用 Microsoft SQL Server 下载。选择最符合你的数据和工作负载需求的 SQL Server 试用版、版本、工具或连接器。[这里是图片001]https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.下载SQL…...
JMeter 测试Dubbo 接口
在使用 JMeter 进行 Dubbo 接口的测试时,JMeter 本身并没有直接支持 Dubbo 协议(基于 RPC)的插件。但是,我们可以通过以下几种方式来测试 Dubbo 接口: 1. 使用 JMeter 的 Java 请求(JDBC 请求)…...
Java 日志技术、Logback日志框架、日志级别
一. 日志 1. 日志:程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。 二. 日志技术 1. 日志技术:可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中) 2. 可以随时以开关的…...
美妆系列圣罗兰气垫粉色与黑色有什么区别?
在美妆界,圣罗兰的气垫一直备受青睐,而其中粉色款和黑色款更是有着各自的特点,存在不少区别呢。 从外观设计来看,粉色款整体给人一种温柔、甜美的感觉,外壳颜色清新,很容易击中少女心,携带在身边…...
HTML中的`<!DOCTYPE html>`是什么意思?
诸神缄默不语-个人CSDN博文目录 在学习HTML时,我们经常会看到HTML文档的开头出现<!DOCTYPE html>,它是HTML文件的第一行。很多初学者可能会疑惑,为什么需要这行代码?它到底有什么作用呢?在这篇文章中࿰…...
Sudo命令的配置及使用
概念 sudo 命令是 Linux 系统中一个非常重要的工具,它允许普通用户以超级用户(通常是 root)或其他用户的身份执行命令。从概念上来说,在普通用户在权限不够的时候,通过 sudo 命令 “摇人”,这个 “人” 就是…...
【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器
【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器 一、前言: 从三方应用跳转到系统浏览器是比较常见的功能。 拓展应用功能边界: 三方应用的功能通常相对聚焦和特定,无法涵盖用户可能需要的所有网络浏览需求。跳转到系统浏览器能让用户访问…...
电梯系统的UML文档06
系统传感器 系统值是用于控制系统的。在类图中系统传感器用一个箭头和系统控制对象连接。 类图中的系统传感器包括AtFloor、电梯呼叫器、关门、开门、门反转、楼层呼叫器和驱动(AtFloor,CarCall,DoorClosed,DoorOpen,…...
指针之旅:从基础到进阶的全面讲解
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文(1)内置数…...
AT8870单通道直流电机驱动芯片
AT8870单通道直流电机驱动芯片 典型应用原理图 描述 AT8870是一款刷式直流电机驱动器,适用于打印机、电器、工业设备以及其他小型机器。两个逻辑输入控制H桥驱动器,该驱动器由四个N-MOS组成,能够以高达3.6A的峰值电流双向控制电机。利用电流…...
RISC-V读书笔记
目录 关于RISC-V 关于RISC-V 简洁 RISC-V是一个崭新的架构,比起来传统的x86-64架构,他更加的简约和现代。下面这种图像阐述了传统的x86的指令集的膨胀速度有多么的吓人(汗颜 这是可以理解的,我们的ISA(Computer Syst…...
游戏开发中常用的设计模式
目录 前言一、工厂模式简单工厂模式工厂方法模式抽象工厂模式 二、单例模式三、观察者模式观察者模式的优势 四、状态模式状态模式的优势 五、策略模式策略模式的优势 六、组合模式七、命令模式八、装饰器模式策略模式与状态模式有什么区别呢? 前言 本文介绍了游戏开发中常用…...
Android 11适配全攻略:从理论到实践
随着Google正式发布Android 11,开发者们迎来了新的挑战和机遇。Android 11不仅带来了全新的用户体验和功能提升,还要求开发者们对应用进行相应的适配,以确保应用的兼容性和稳定性。本文将从理论到实践,全面解析Android 11的适配攻…...
Grafana 统一可视化了,告警如何统一?
对于大部分公司,通常都不止一套监控、可观测性相关的系统,云上的、云下的,开源的、商业的,指标的、日志的、链路的,各个系统体验不同,权限难管,如何统一化并为各个团队赋能,是很多技…...
ubuntu20.04有亮度调节条但是调节时亮度不变
尝试了修改grub文件,没有作用,下载了brightness-controllor,问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…...
抖音小程序一键获取手机号
前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…...
某政务行业基于 SeaTunnel 探索数据集成平台的架构实践
分享嘉宾:某政务公司大数据技术经理 孟小鹏 编辑整理:白鲸开源 曾辉 导读:本篇文章将从数据集成的基础概念入手,解析数据割裂给企业带来的挑战,阐述数据集成的重要性,并对常见的集成场景与工具进行阐述&…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)
为进一步测试通过请求头传递token进行身份验证,在main.htm中增加layui的数据表格组件,并调用后台服务分页显示数据,后台分页查询数据接口如下所示(测试时,直接将数据写死到代码中,没有查询数据库࿰…...
Android 高德地图API(新版)
新版高德地图 前言正文一、创建应用① 获取PackageName② 获取调试版安全码SHA1③ 获取发布版安全码SHA1 二、配置项目① 导入SDK② 配置AndroidManifest.xml 三、获取当前定位信息① ViewBinding使用和导包② 隐私合规设置③ 权限请求④ 初始化定位⑤ 获取定位信息 四、显示地…...
51c~缺陷检测~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12386431 一、缺陷检测~使用深度学习1 这里研究工业ai, 在制造业中任何公司的主要目标都是为客户生产无缺陷产品。如果在产品开发过程中出现任何内部孔、凹坑、磨损或划痕(由于多种原因,从生产设备…...
强化学习与ai黑科技实例
一.强化学习简介和其应用 (1)强化学习,深度学习,有监督,无监督区别与联系。 1)强化学习讨论的核心就是智能机(agent)怎么在复杂,不确定的环境中最大化它能获得的奖励。 2)人工智能包括机器学习,机器学习包括有监督学习,无监督学习(例如聚类…...
《TikTok归来:机遇与挑战并存》
TikTok 回归:波折中的 “重生” 在全球社交媒体的版图中,TikTok 的存在无疑是一颗璀璨的明星。它以独特的短视频形式、强大的算法推荐以及丰富多样的内容,迅速风靡全球,吸引了数以亿计的用户。然而,其发展并非一帆风顺…...
Rust语言的正则表达式
Rust语言的正则表达式 正则表达式(Regular Expressions,简称Regex)是一种强大的文本处理工具,广泛应用于字符串的搜索、匹配、替换和解析。在Rust语言中,正则表达式的支持既高效又功能强大,非常适合开发者…...
三维扫描赋能文化:蔡司3D扫描仪让木质文化遗产焕发新生-沪敖3D
挪威文化历史博物馆在其修复工作中融入现代3D扫描技术,让数百年的历史焕发新生。 文化历史博物馆的工作 文化历史博物馆是奥斯陆大学的一个院系。凭借其在文化历史管理、研究和传播方面的丰富专业知识,该博物馆被誉为挪威博物馆研究领域的领先机构。馆…...
c# PDF文件合并工具
界面 主要用于发票PDF文件的合并。经常出差要报销的很有用。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System…...
【16届蓝桥杯寒假刷题营】第1期DAY5
5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a,下标从 1 开始。 她有 m 次查询操作,每次她会查询下标区间在 [li,ri] 的 a 中元素和。她想知道你可以重新排序序列 a,使得这 m 次查询的总和最小。 求你求出 m 次…...
.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...
(7)(7.2) 围栏
文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形(“TinCan”)和多边形和/或圆柱形、…...
1166 Summit (25)
A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…...
linux_socket
udp 通信 server #include <iostream> #include <arpa/inet.h> #include <unistd.h> #include <cstring>using namespace std;#define UPORT 12511int main(){int sock socket(AF_INET, SOCK_DGRAM, 0); // 创建一个UDP套接字if (sock -1) {cout&…...
Linux探秘坊-------3.开发工具详解(2)
1.动静态库和动静态链接(操作) 静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件 ⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名⼀般为“.a” 动态库与之相反,在编译链接时并 没有把库⽂件的代码加⼊到可执⾏⽂件中 ,⽽…...