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

jenkins扩展你的流水线

文章目录

  • 一、概述
  • 二、可信库和不可信库
    • `可信库`
    • `不可信库`
  • 三、内部库与外部库
    • `内部库`
      • SSH访问
      • HTTP 访问
    • `外部库`
      • 配置一个外部库
  • 四、在流水线脚本中使用库
    • `从源码版本控制中自动下载库`
    • `加载库到脚本中`
      • @Library 注解
      • 库步骤
      • 库指令
  • 五、Jenkins 项目中的库范围
  • 六、共享库代码的结构
    • `src`
      • 示例一:
      • 示例二:
      • 示例三:
      • 示例四(`推荐使用`)
    • `vars`
      • 示例
      • 全局变量的自动文档引用
      • 像使用步骤一样使用全局变量
        • 示例一:
        • 示例二
        • 示例三(推荐使用)
    • `resources`
  • 六、使用第三方库
  • 七、直接加载代码
  • 八、从外部 SCM 加载代码
  • 九、回放外部代码和库
  • 十、深入研究可信与不可信代码
  • 十一、参考文章


一、概述

与任何编程环境一样,在 Jenkins 流水线中,集中化功能、共享公共代码和代码重用都是快速、有效地进行开发的基本技术。这些实践鼓励使用标准方法来调用功能,为更复杂的操作创建构建块并隐藏复杂性。它们还可以用于提供一致性以及鼓励约定优于配置以简化任务。

Jenkins 允许用户完成所有这些操作的 一个关键方法就是,使用共享流水线库。共享流水线库是由存储在代码仓库中的代码组成的,该代码仓库由 Jenkins 自动下载并可供流水线使用。

二、可信库和不可信库

可信库

可信库可以调用/使用 Java 中的任何方法、 Jenkins API 、Jenkins 插件、 Groovy 语言等。对可信库进行更新应该需要适当级别的源码版本控制访问和验证

不可信库

  • 不可信代码是被调用和使用限制的代码 调用先前列出的方法类型不允许使用相同的自由度,而且它不能像可信代码那样访问更大的内部对象集合。
  • 不可信代码运行在 Groovy 沙箱中,它具有一个可“安全”调用的方法列表。在沙箱中运行时, Jenkins 会监控库代码是否在尝试调用不存在于安全列表中的任何方法。如果是,则停止执行代码并且必须由管理员授予批准。
    在这里插入图片描述

三、内部库与外部库

内部库

这是一种管理库的旧方法,但仍然是一种选择。 Jenkins 包含一个内部 Git 仓库,可用于存储内部库或测试目的。放置在此库中的任何内容对于所有脚本都是可信的,但推送代码到该库的任何人都必须具有相应的管理权限。

内部 Git 仓库有 一个特定的名称: workflowLibs.git 。它可以通过 SSH 访问或 HTTP 访问与 Git 一起工作。

SSH访问

系统管理→全局安全配置
在这里插入图片描述
指定一个端口并保存
在这里插入图片描述
用户列表
在这里插入图片描述
选admin用户
在这里插入图片描述
设置
在这里插入图片描述
讲linux服务器的公钥粘贴到下方
在这里插入图片描述

在这里插入图片描述

到linux机器上执行如下命令

git clone ssh://admin@192.168.1.2:22222/workflowlibs.git

HTTP 访问

git clone http://192.168.1.2:8080/workflowLibs.git

一旦复制了 内部仓库 ,它的初始状态为空。要开始使用它,你需要切换到工作目录并创一个新的主分支:

cd workflowLibs/
git checkout -b master

外部库

配置一个外部库

系统管理→系统配置→Global Pipeline Libraries
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参数解释:

Name:库的名称(将在脚本中使用它来进行访问)
Default Version:可以是分支或标签
Load implicitly:隐式加载。如果选中,脚本将自动访问这个库,而不需要通过@Library请求它;
Allow default version to be overridden:可以通过在@Library 注解中指定@version 来覆盖默认版本,如@Library('libname@version')_ 
Includ@Library changes in recent job changes:在最近的任务变更集中包含@Library 更改。可以通过在注解中添加 changelog = <boolean> 参数来覆盖此设置,如:@Library(value="libname[@version]",changelog=truejfalse)

四、在流水线脚本中使用库

从源码版本控制中自动下载库

在这里插入图片描述

加载库到脚本中

如果有内容,那么 workflowlibs 全局内部库将会被自动加载。你可以使用隐式加载复选项指定用于流水线的外部库应该被自动加载。

如果你选择了隐式加载库,你仍然可以使用以下格式的import 语句指定一组方法

//导人 一些方法的合集
import static org.demo.Utilities.*

如果不使用自动加载库的选项,则必须在流水线脚本中使用语句来显式地加载库并使其可用 。有几种不同的方法可以做到这 点

@Library 注解

在基于Java 的语 句中,注解是可以放在代码中以增加(或“注解”)其他代码的元数据。

在使用 Jenkins 流水线语法的情况下,注解结构不仅用作注解, 且能更多地用作另一种语法构造。

具体来说,你可以在流水线脚本中使用 Library 注解来 加载库。要 加载库的名称以及可选的版本都被指定为参数。此处是其基本语法:

@Library ('<libname>[@<version>]')_ [<import statement>]

关于语法有以下要点。
在这里插入图片描述
以下是一些简单的示例:

//加载 一个库的默认版本
@Library ('mylib')_ 
//加载一个库的指定版本并覆盖默认版本
@Library('yourlib@2.0')_ 
//用一条语句访 问多个库
@Library(['myLib','yourlib@master')
//带导人语句的注解
@Library('mylib@l.0') import static org.demo.Utilities.*

注解会被放置在脚本的开头,脚本式流水线的 node 行上方,或者声明式流水线中pipeline 上方。

库步骤

从Jenkins 2.7 开始,可以在流水线中使用实际的 library 步骤。语法类似于注解:

library "<libname>[@<version>]"

由于这是 一个实际的流水线步骤,因此可以将其放置在流水线中的任何位置。它还允许使用变 量代替参数。例如,你可以将其定义为从内置 BRANCH_NAME 变量代表的当前任何版本中获取共享库。

library "<libname>@$<BRANCH_NAME>"

库指令

在声明式流水线中,我们还有另 一个用于提取库的选项。我们可以使用 libraries 指令指定要加载的库。在指令中,我们可以使用 lib 语句指定库。

在这里插入图片描述

五、Jenkins 项目中的库范围

如果在 Jenkins 全局/根级别指定隐式加载 ,则所 有任务都将自动下载库并且库可用。
但是,如果你配置文件夹并隐式地加载一 个指定的共享库,则只有该文件夹中的任务才能自动下载和访问库
在这里插入图片描述

六、共享库代码的结构

一个共享库树有 3个子树:src 、vars和 resources 。
在这里插入图片描述

src

此区域旨在使用标准 Java 目录结构的 Groovy 文件进行设置(即src/org/foo/bar.groovy),当执行流水线时,它将被添加到类路径中。

示例一:

创建 一个不包 在类中的简单方怯

在外部库创建groovy文件:src/org/demo/build.groovy
在这里插入图片描述
build.groovy的内容:

//org.demo.build.groovy
package org.demo
def mvnBuild(args) {sh """echo "mvn -q ${args} -Dmaven.test.skip=true""""
}

在脚本式流水线中引用:

node() {def myBuild = new org.demo.build()myBuild.mvnBuild("clean install")
}

在这里插入图片描述

示例二:

创建 一个封闭类(以便定义超类) ,然后,你可以在类的构造函数或方法中通过将 steps 对象传递给 一个方法来获取访问所有 DSL 步骤的权限。

src/org/demo/Utilities.groovy

//org.demo.Utilities.groovyclass Utilities implements Serializable {def stepsUtilities(steps) {this.steps = steps}def mvnBuild(args) {steps.sh """echo "mvn -q ${args} -Dmaven.test.skip=true""""}
}

由于我们将其封装在 一个类中,因此该类必须实现 Serializable 以支持在流水线停 止或重新启动 时能保存状态。
脚本式流水线

@Library('share_library') import org.demo.Utilities
def utils = new Utilities(steps)node() {step([$class: 'WsCleanup'])     //清理工作空间utils.mvnBuild "clean install"
}

示例三:

其它项(如环境变量)可以用与步骤相同的方式进行传递。在下面的代码中,我们传入 env 对象并在我 的代码中使用它

src/org/demo/Utilities.groovy

//org.demo.Utilities.groovyclass Utilities implements Serializable {def envdef stepsUtilities(env,steps) {this.env = envthis.steps = steps}def mvnBuild(args) {steps.sh """echo "构建号:${env.BUILD_NUMBER}"echo "mvn -q ${args} -Dmaven.test.skip=true""""}
}

脚本式流水线代码:

@Library('share_library') import org.demo.Utilities
def utils = new Utilities(env,steps)node() {step([$class: 'WsCleanup'])     //清理工作空间utils.mvnBuild "clean install"
}

在这里插入图片描述

示例四(推荐使用

对于更简单的情况,你只需传人Script 对象,该对象已经可以访问所有内容。在这种情况下,我们将它传递给静态方法:

src/org/demo/Utilities.groovy脚本

//org.demo.Utilities.groovy
package org.democlass Utilities {static def mvnBuild(script,args) {script.sh """echo "构建号:${script.env.BUILD_NUMBER}"echo "mvn -q ${args} -Dmaven.test.skip=true""""}
}

脚本式流水线代码

@Library('share_library') import static org.demo.Utilities.*node() {step([$class: 'WsCleanup'])     //清理工作空间mvnBuild this, "clean install"
}

vars

用于 托管脚本,这些脚本定义了变量并关联了你想要在流水线中使用的方法。
你可以在一 个Groovy文件的vars区域 定义可能想要用于流水线 中变量 的任何方法。

示例

在这里插入图片描述

vars/timedCommand.groovy

// vars/timedCommand.groovy
def setCommand(commandToRun) {cmd = commandToRun
}
def getCommand() {cmd
}
def runCommand() {timestamps {cmdOut = sh(script:"${cmd}",returnStdout:true).trim()}
}
def getOutput() {cmdOut
}

cmd 和cmdOut 在此处不是字段,而是按需创建的对象。

脚本式流水线代码:

@Library('share_library')_node() {step([$class: 'WsCleanup'])     //清理工作空间timedCommand.cmd = 'echo 123'echo timedCommand.cmd timedCommand.runCommand() echo timedCommand.getOutput()
}

全局变量的自动文档引用

在vars目录下创建文件timedCommand.txt
在这里插入图片描述
内容为:

# 变量文档说明
xxxx

当执行过使用timedCommand变量的流水线后,在流水线语法→全局变量
在这里插入图片描述
在这里插入图片描述
可以看到有关timedCommand变量的文档说明
在这里插入图片描述

像使用步骤一样使用全局变量

你可以创建全局变量定义,其行为类似于流水线脚本中的步骤。也就是说,它们可以像常规流水线步骤 一样被调用 。
解决这个问题的方法是在全局变量的定义中定义 call 方法。

示例一:

vars/timedCommand2.groovy

//vars/timedCommand2.groovy
def call(cmd,logFilePath) {timestamps {cmdOutput = sh(script:"${cmd}",returnStdout:true).trim()}echo cmdOutputwriteFile file:"${logFilePath}", text:"${cmdOutput}"
}

脚本式流水线:

@Library('share_library')_node() {step([$class: 'WsCleanup'])     //清理工作空间timedCommand2 'ls -la','test.log'
}

示例二

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
脚本式流水线

@Library('share_library')_node() {step([$class: 'WsCleanup'])     //清理工作空间timedCommandWindow {echo "在Windows上执行"}timedCommandLinux {echo "在Linux上执行"}
}

示例三(推荐使用)

我们可以扩展调用机制来创建 一个简单的框架,使得我们在脚本中使用“步骤”更简单并且更像是具有多个值的标准 DSL 调用

这是通过将参数传递给 一个映射, 并在步骤中的其他处理环节引用映射来实现的。

vars/timedCommand3.groovy

//vars/timedCommand3.groovydef call(body) {//收集赋值并传送到我们的映射中def settings= [:]body.resolveStrategy = Closure.DELEGATE_FIRSTbody.delegate = settingsbody()timestamps {cmdOutput = sh(script:"${settings.cmd}",returnStdout:true).trim()}echo cmdOutputwriteFile file:"${settings.logFilePath}", text:"${cmdOutput}"
}

通过 def settings = [] 语法声明了 一个Groovy 映射。然后将传参保存在映射中,然后我们可以执行任何步骤。这里用于 delegate 的引用与 Groovy能有关。

脚本式流水线:

@Library('share_library')_node() {step([$class: 'WsCleanup'])     //清理工作空间timedCommand3 {cmd = 'ls -la'logfilePath = 'log.out'}
}

这种方式最有价值的地方在于,允许我们使用命名参数调用函数,并且无关参数的顺序,这可以使我们的流水线脚本中的代码更简单且更容易理解和维护。

resources

非Groovy 文件可以存储在此目录中。它们可以通过外部库中的 libraryResource 步骤加载。
在这里插入图片描述
语法:

def datafile = libraryResource 'org/conf/data/lib/datafile.ext'

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、使用第三方库

在这里插入图片描述
在这里插入图片描述

七、直接加载代码

groovy调用其它groovy脚本定义的方法

八、从外部 SCM 加载代码

依赖远程 加载器插件 (Pipeline Remote Loader plugin )
在这里插入图片描述
在这里插入图片描述

九、回放外部代码和库

在这里插入图片描述

可以直接修改代码,并点击运行,旨在验证修改的代码,并不会改变原来的代码,主要用于临时验证代码
在这里插入图片描述

十、深入研究可信与不可信代码

十一、参考文章

《Jenkins2权威指南》
Jenkins 设置共享库
Jenkins共享库使用

相关文章:

jenkins扩展你的流水线

文章目录一、概述二、可信库和不可信库可信库不可信库三、内部库与外部库内部库SSH访问HTTP 访问外部库配置一个外部库四、在流水线脚本中使用库从源码版本控制中自动下载库加载库到脚本中Library 注解库步骤库指令五、Jenkins 项目中的库范围六、共享库代码的结构src示例一&am…...

Golang模糊测试入门

本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以试图找到漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。 在本教程中,您将为一个简单的函数编写模糊测试,运行 go 命…...

ARM uboot 的移植4 -从 uboot 官方标准uboot开始移植

一、添加DDR初始化1 1、分析下一步的移植路线 (1) cpu_init_crit 函数成功初始化串口、时钟后&#xff0c;转入 _main 函数&#xff0c;函数在 arch/arm/lib/crt0.S 文件中。 (2) 在 crt0.S 中首先设置栈&#xff0c;将 sp 指向 DDR 中的栈地址&#xff1b; #if defined(CONF…...

不用索引怎么优化百亿数据? | MySQL性能优化篇

文章目录数据库调优一、数据库调优原理1.1 为什么要进行MySQL数据库调优&#xff1f;1.2 什么影响数据库性能&#xff1f;1.3 数据库调优到底调什么&#xff1f;二、数据库压力测试2.1 什么是压测&#xff1f;2.2 JMeter简介2.3 驱动下载2.4 测试过程三、连接池3.1 压力测试连接…...

JavaScript(WebAPI)

目录 1.什么是Web API? 2.DOM和DOM树 3.获取元素 4.事件 5.操作元素 获取/修改元素内容 1.innerText 2. innerHTML 获取/修改元素属性 获取/修改表单元素属性 获取/修改样式属性 1.修改内联样式 2.修改元素应用的CSS类名 6.操作节点 新增节点 删除节点 7.案例…...

idea集成GitHub

设置 GitHub 账号绑定账号有两种方式&#xff1a;1. 通过授权登录2.如果上述登录不成功&#xff0c;用Token口令的方式登录&#xff0c;口令在github账号哪里生成&#xff0c;点击settings --->Developer settings --->pwrsonal access tokens ----> 复制口令到idea 口…...

软考高级信息系统项目管理师系列之四十一:项目组合管理

软考高级信息系统项目管理师系列之四十一:项目组合管理 一、项目组合管理内容二、项目组合管理基础概述1.项目组合定义及相关知识图2.项目组合、项目集和项目之间的关系3.项目组合模块具备的特征三、项目组合管理1.项目组合管理定义及要求2.不同级别管理之间的特性及关联3.项目…...

Spring——Spring整合Mybatis(XML和注解两种方式)

框架整合spring的目的:把该框架常用的工具对象交给spring管理&#xff0c;要用时从IOC容器中取mybatis对象。 在spring中应该管理的对象是sqlsessionfactory对象&#xff0c;工厂只允许被创建一次&#xff0c;所以需要创建一个工具类&#xff0c;把创建工厂的代码放在里面&…...

【专项训练】布隆过滤器和LRU缓存

布隆过滤器:与哈希表类似 哈希表是一个没有误差的数据结构! 有哈希函数得到index,会把要存的整个元素放在哈希表里面 有多少元素,每个元素有多大,所有的这些元素需要占的内存空间,在哈希表中都要找相应的内存大小给存起来 事实上,我们并不需要存所有的元素本身,而是只…...

从一道面试题看 TCP 的吞吐极限

分享一个 TCP 面试题&#xff1a;单条 TCP 流如何打满香港到旧金山的 320Gbps 专线&#xff1f;(补充&#xff0c;写成 400Gbps 更具迷惑性&#xff0c;但预测大多数人都会跑偏&#xff0c;320Gbps 也就白给了) 这个题目是上周帮一个朋友想的&#xff0c;建议他别问三次握手&a…...

rsync 的用法

rsync 介绍下 用法 rsync是一个常用的数据同步工具&#xff0c;它能够在本地和远程系统之间同步文件和目录。以下是rsync的基本用法&#xff1a; 同步本地文件夹&#xff1a; bash Copy code rsync -av /path/to/source /path/to/destination其中&#xff0c;-a表示归档模式&…...

【LeetCode每日一题:[面试题 17.05] 字母与数字-前缀和+Hash表】

题目描述 给定一个放有字母和数字的数组&#xff0c;找到最长的子数组&#xff0c;且包含的字母和数字的个数相同。 返回该子数组&#xff0c;若存在多个最长子数组&#xff0c;返回左端点下标值最小的子数组。若不存在这样的数组&#xff0c;返回一个空数组。 示例 1: 输入…...

华为OD机试题 - 简易压缩算法(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:简易压缩算法题目输入输出示例一输入输出说明示例二输入输出说明…...

Kubenates中的日志收集方案ELK(下)

1、rpm安装Logstash wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.7.rpm yum install -y logstash-6.8.7.rpm2、创建syslog配置 input {beats{port> 5044 } }output {elasticsearch {hosts > ["http://localhost:9200"]index …...

LeetCode - 42 接雨水

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例1 输入&…...

python --生成时间序列,作为横轴的标签。时间跨越2008-2022年,生成每年的6-10月的第一天作为时间序列

python 生成制定的时间序列作为绘图时x轴的标签 问题需求 在绘图时&#xff0c;需要对于x轴的标签进行专门的设置&#xff0c;整体时间跨越2008年-2022年&#xff0c;将每年的6-10月的第一天生成一条时间序列&#xff0c;绘制成图。 解决思路 对于时间序列的生成&#xff0…...

【Unity VR开发】结合VRTK4.0:创建一个按钮(Togglr Button)

语录&#xff1a; 有人感激过你的善良吗&#xff0c;貌似他们只会得寸进尺。 前言&#xff1a; Toggle按钮是提供简单空间 UI 选项的另一种方式&#xff0c;在该选项中&#xff0c;按钮将保持其状态&#xff0c;直到再次单击它。这允许按钮处于激活状态或停用状态的情况&#…...

lottie-miniprogram在taro+vue的小程序中怎么使用

把一个json的动图展示在页面上。使用的是插件lottie-miniprogramhttps://blog.csdn.net/qq_33769914/article/details/128705922之前介绍过。但是发现使用在taro使用的时候他会报错。那可能是因为我们 wx.createSelectorQuery().select(#canvas).node(res > {console.log(re…...

C++回顾(二十二)—— stack容器 与 queue容器

22.1 stack容器 &#xff08;1&#xff09; stack容器简介 stack是堆栈容器&#xff0c;是一种“先进后出”的容器。stack是简单地装饰deque容器而成为另外的一种容器。添加头文件&#xff1a;#include <stack> &#xff08;2&#xff09;stack对象的默认构造 stack…...

逻辑优化基础-disjoint support decomposition

先遣兵 在了解 disjoint support decomposition 之前&#xff0c;先学习两个基本的概念。 disjoint 数学含义上的两个集合交集&#xff0c;所谓非相交&#xff0c;即交集为空集。 A∩BC⊘A \cap B C \oslash A∩BC⊘ support 逻辑综合中的 supportsupportsupport 概念是…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...