前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中jmespath解析提取json数据

Python中jmespath解析提取json数据

作者头像
王大力测试进阶之路
发布于 2022-03-14 06:31:24
发布于 2022-03-14 06:31:24
5.4K00
代码可运行
举报
文章被收录于专栏:橙子探索测试橙子探索测试
运行总次数:0
代码可运行

在做接口自动化,测试断言时,我们经常需要提取接口的的响应数据字段,以前用过jsonpath,有几篇相关文章,可以参考下(Python深层解析json数据之JsonPath【Jmeter篇】后置处理器之正则提取器、Json提取器Jmeter之json提取器实战(二)Jmeter之json条件提取实战(三) )今天我们来介绍下jmespath用法,可以帮我们进行数据的灵活提取,下面通过案例来说明jmespath在python的使用。

jmespath官方文档

https://jmespath.org/tutorial.html#projections

jmespath安装

pip install jmespath

字典,通过key名称提取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
dict_1 = {"a": "foo", "b": "bar", "c": "baz"}
print(jmespath.search("c",dict_1))

baz

嵌套字典,层级提取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
dict_1 = {"a": {"b": {"c": {"d": "value"}}}}
print(jmespath.search("a.b.c.d",dict_1))

value

import jmespath
dict_1 = {"a": {"b": {"c": {"d": "value"}}}}
print(jmespath.search("a.b.c",dict_1))

{'d': 'value'}

列表,通过索引提取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
list_1 = ["a", "b", "c", "d", "e", "f"]
print(jmespath.search("[1]",list_1))

b

列表、字典嵌套提取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {"a": {
  "b": {
    "c": [
      {"d": [0, [1, 2]]},
      {"d": [3, 4]}
    ]
  }
}}
print(jmespath.search("a.b.c[0].d[1][0]",source))

1

切片提取列表中值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[0:5]",source))

[0, 1, 2, 3, 4]

import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[5:10]",source))

[5, 6, 7, 8, 9]

import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[:5]",source))

[0, 1, 2, 3, 4]

import jmespath
source = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(jmespath.search("[::2]",source))

[0, 2, 4, 6, 8]

列表取值使用 * 通配符

1、取出列表中所有 first对应的值

people[*].first

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {"first": "James", "last": "d"},
    {"first": "Jacob", "last": "e"},
    {"first": "Jayden", "last": "f"},
    {"missing": "different"}
  ],
  "foo": {"bar": "baz"}
}
print(jmespath.search("people[*].first",source))

['James', 'Jacob', 'Jayden']

2、取出列表中前2个first 对应的值

people[:2].first

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {"first": "James", "last": "d"},
    {"first": "Jacob", "last": "e"},
    {"first": "Jayden", "last": "f"},
    {"missing": "different"}
  ],
  "foo": {"bar": "baz"}
}
print(jmespath.search("people[:2].first",source))

['James', 'Jacob']

对象取值使用 * 通配符

取出ops 对象的任意属性对应的numArgs值 ops.*.numArgs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "ops": {
    "functionA": {"numArgs": 2},
    "functionB": {"numArgs": 3},
    "functionC": {"variadic": 1}
  }
}
print(jmespath.search("ops.*.numArgs",source))

[2, 3]

子查询使用 * 通配符

在查询的结果中继续使用 * 通配符,查询的结果是列表的列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "reservations": [
    {
      "instances": [
        {"state": "running"},
        {"state": "stopped"}
      ]
    },
    {
      "instances": [
        {"state": "terminated"},
        {"state": "running"}
      ]
    }
  ]
}
print(jmespath.search("reservations[*].instances[*].state",source))

[['running', 'stopped'], ['terminated', 'running']]

我们希望结果为[“ running”, “ stopped”, “ terminated”, “ running”]一个状态列表,可以使用 [] 而不是 [*]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(jmespath.search("reservations[].instances[].state",source))

['running', 'stopped', 'terminated', 'running']

过滤器使用

过滤器表达式是为数组定义的,其一般形式为 [?<表达式> <比较器> <表达式>]。

常用的比较表达式可以使用 ==, !=, <, <=, >, > =

假设我们有一个设备列表,每个设备都有一个名称和一个 state。我们想要所有正在运行的计算机的名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "machines": [
    {"name": "a", "state": "running"},
    {"name": "b", "state": "stopped"},
    {"name": "b", "state": "running"}
  ]
}
print(jmespath.search("machines[?state=='running'].name",source))

['a', 'b']

管道表达式

前面在匹配list里面的多个值时候,查询的结果是一个list,如果我想取出结果里面的第一个可以使用管道符 |

取出people下所有对象的 first 属性,从结果里面取第一个值:people[*].first | [0]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {"first": "James", "last": "d"},
    {"first": "Jacob", "last": "e"},
    {"first": "Jayden", "last": "f"},
    {"missing": "different"}
  ],
  "foo": {"bar": "baz"}
}
print(jmespath.search("people[*].first | [0]",source))

James

多选列表创建一个列表

到目前为止,我们已经研究了JMESPath表达式,这些表达式有助于将JSON文档缩减为您感兴趣的元素。下一个概念, 多选列表和 多选哈希允许您创建JSON元素。这使您可以创建JSON文档中不存在的元素。多选列表创建一个列表,多选哈希创建一个JSON对象。

这是一个多选列表的示例:people[].[name, state.name]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {
      "name": "a",
      "state": {"name": "up"}
    },
    {
      "name": "b",
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "state": {"name": "up"}
    }
  ]
}
print(jmespath.search("people[].[name, state.name]",source))

[['a', 'up'], ['b', 'down'], ['c', 'up']]

在上面的表达式中,[name, state.name]部分是一个多选列表。它说要创建一个由两个元素组成的列表,第一个元素是针对list元素评估名称表达式的结果,第二个元素是对state.name评估的结果。因此,每个列表元素将创建一个两个元素列表,并且整个表达式的最终结果是两个元素列表的列表。

与投影不同,即使结果为null,也始终包含表达式的结果。如果将以上表达式更改为people []。[foo, bar],则每个两个元素列表将为[null, null]。

多重选择具有与多重选择列表相同的基本概念,不同之处在于它会创建哈希而不是数组。使用上面的相同示例,如果我们想创建一个具有两个键Name和 State的两个元素哈希,则可以使用以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {
      "name": "a",
      "state": {"name": "up"}
    },
    {
      "name": "b",
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "state": {"name": "up"}
    }
  ]
}
print(jmespath.search("people[].{Name: name, State: state.name}",source))

[{'Name': 'a', 'State': 'up'}, {'Name': 'b', 'State': 'down'}, {'Name': 'c', 'State': 'up'}]

函数的使用

JMESPath支持函数表达式,例如:length(people)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {
      "name": "b",
      "age": 30,
      "state": {"name": "up"}
    },
    {
      "name": "a",
      "age": 50,
      "state": {"name": "down"}
    },
    {
      "name": "c",
      "age": 40,
      "state": {"name": "up"}
    }
  ]
}
print(jmespath.search("length(people)",source))

3

函数可用于以强大的方式转换和过滤数据。可以在此处找到函数的完整列表,并且 函数表达式规范具有完整的详细信息。

以下是一些功能示例。

本示例在people数组中打印最老的人的名字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "people": [
    {
      "name": "b",
      "age": 30
    },
    {
      "name": "a",
      "age": 50
    },
    {
      "name": "c",
      "age": 40
    }
  ]
}
print(jmespath.search("max_by(people, &age).name",source))

a

函数也可以与过滤器表达式组合。在下面的示例中,JMESPath表达式在myarray中查找包含字符串foo的所有元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = {
  "myarray": [
    "foo",
    "foobar",
    "barfoo",
    "bar",
    "baz",
    "barbaz",
    "barfoobaz"
  ]
}
print(jmespath.search("myarray[?contains(@, 'foo') == `true`]",source))

['foo', 'foobar', 'barfoo', 'barfoobaz']

场景一,接口响应数据,提取code、msg、status字段进行断言

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
source = {
  "code": 0,
  "msg": "成功",
  "trace": "ad12de4",
  "data": {
    "total": 205,
    "list": [{
      "id": 15000087,
      "name": "促销员",
      "job_nature": 2,
      "category_id": 61,
      "user_id": 589601,
      "company_id": 5084,
      "group_id": 5084,
      "status": 4,
      "audit_type": 0,
      "company_name": "二十二门店",
      "job_nature_zh": "兼职",
      "salary_zh": "1000元\/时",
      "show_status": 5,
      "manage_status_reason": "",
      "status_zh": "停招",
      "browse_users_num": 0,
      "communication_users_num": 0,
      "sign_up_users_num": 0,
      "job_card_time_remaining": 22,
      "job_top_card_time_remaining": 0
    }, {
      "id": 15000078,
      "name": "促销员",
      "job_nature": 1,
      "category_id": 61,
      "user_id": 589601,
      "company_id": 1000064,
      "group_id": 5084,
      "status": 4,
      "audit_type": 100,
      "company_name": "二十二门店",
      "job_nature_zh": "全职",
      "salary_zh": "2000-3000元\/月",
      "show_status": 6,
      "manage_status_reason": "",
      "status_zh": "停招",
      "browse_users_num": 0,
      "communication_users_num": 0,
      "sign_up_users_num": 0,
      "job_card_time_remaining": 0,
      "job_top_card_time_remaining": 0
    }, {
      "id": 15000077,
      "name": "促销员",
      "job_nature": 1,
      "category_id": 61,
      "user_id": 589601,
      "company_id": 5084,
      "group_id": 5084,
      "status": 4,
      "audit_type": 100,
      "company_name": "二十二门店",
      "job_nature_zh": "全职",
      "salary_zh": "2000-3000元\/月",
      "show_status": 2,
      "manage_status_reason": "",
      "status_zh": "停招",
      "browse_users_num": 0,
      "communication_users_num": 0,
      "sign_up_users_num": 0,
      "job_card_time_remaining": 0,
      "job_top_card_time_remaining": 0
    }, {
      "id": 13076362,
      "name": "收银员",
      "job_nature": 2,
      "category_id": 97,
      "user_id": 589601,
      "company_id": 5084,
      "group_id": 5084,
      "status": 4,
      "audit_type": 1,
      "company_name": "二十二门店",
      "job_nature_zh": "兼职",
      "salary_zh": "1000元\/时",
      "show_status": 2,
      "manage_status_reason": "",
      "status_zh": "停招",
      "browse_users_num": 0,
      "communication_users_num": 0,
      "sign_up_users_num": 0,
      "job_card_time_remaining": 0,
      "job_top_card_time_remaining": 0
    }, {
      "id": 13076361,
      "name": "品类管理",
      "job_nature": 1,
      "category_id": 102,
      "user_id": 589601,
      "company_id": 5084,
      "group_id": 5084,
      "status": 1,
      "audit_type": 1,
      "company_name": "二十二门店",
      "job_nature_zh": "全职",
      "salary_zh": "2000-3000元\/月",
      "show_status": 1,
      "manage_status_reason": "",
      "status_zh": "招聘中",
      "browse_users_num": 3,
      "communication_users_num": 1,
      "sign_up_users_num": 1,
      "job_card_time_remaining": 342,
      "job_top_card_time_remaining": 0
    }]
  }
}

print(jmespath.search("code",source)) # 0
print(jmespath.search("msg",source)) # 成功
print(jmespath.search("data.list[].status",source))  # [4, 4, 4, 4, 1]

场景二,接口响应数据,提取列表类模块某字段进行断言

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import jmespath
source = [{
  "Name": "晨练指数",
  "ID": 100,
  "Ascending": 1,
  "LocalDateTime": "2021-11-11T07:00:00+08:00",
  "EpochDateTime": 1636585200,
  "Value": 4.0,
  "Category": "不宜",
  "CategoryValue": 4,
  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",
  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}, {
  "Name": "穿衣指数",
  "ID": 101,
  "Ascending": 1,
  "LocalDateTime": "2021-11-11T07:00:00+08:00",
  "EpochDateTime": 1636585200,
  "Value": 5.0,
  "Category": "初冬装",
  "CategoryValue": 5,
  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",
  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}, {
  "Name": "感冒指数",
  "ID": 102,
  "Ascending": 1,
  "LocalDateTime": "2021-11-11T07:00:00+08:00",
  "EpochDateTime": 1636585200,
  "Value": 2.0,
  "Category": "较易发",
  "CategoryValue": 2,
  "MobileLink": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn",
  "Link": "http://m.weathercn.com/zh/cn/pudong-new-district/74761/weather-forecast/74761?lang=zh-cn"
}]

print(jmespath.search("[].Name",source)) 

['晨练指数', '穿衣指数', '感冒指数']
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
邹良城:视频聚合类APP的网络版权侵权认定问题
  本文为作者在“第三届中国互联网新型版权研讨会——互联网+内容产业的生态发展及制度保障”上的发言。 邹良城  腾讯公司诉讼维权总监   各位领导,各位专家、同行,大家下午好,非常荣幸参加今天的
腾讯研究院
2018/03/06
2.9K0
邹良城:视频聚合类APP的网络版权侵权认定问题
像追女孩一样去渗透之信息收集
在IT行业摸索了很多年终于找到了一生所爱(信息安全),为了这份爱能传递下去,我将以这份脱单攻略来讲述我是如何get挚爱shell!希望大家都能get到女神的shell
黑伞安全
2019/10/16
3.2K0
《热血长安》网剧一举击破30亿播放量,影视娱乐今天得这样玩?
这几天又有一部网剧在微博火了,我关注的影视类大V都在转发《热血长安》的影评内容。“三口看片”发布的相关短视频在微博上转发量达到1.4万、在秒拍有600多万的播放;毒舌电影的一条短视频在秒拍播放有500
罗超频道
2018/04/26
7170
《热血长安》网剧一举击破30亿播放量,影视娱乐今天得这样玩?
PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
小华同学ai
2025/02/09
3500
PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
【数据】常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记、出行、词典、电商、地图、电影、即时通讯、开发者网站、快递查询、旅游、社交、视频、天气、团队协作、图片与图像处理、外卖、消息推送、音乐、云、语义识别、语音识别、杂志、综合 进行了如下分类。 笔记 OneNote - OneNote支持获取,复制,创建,更新,导入与导出笔记,支持为笔记添加多媒体内容,管理权限等。提供SDK和Demo。 为知笔记 - 为知笔记Windows客户端开放了大量的API,其中绝大部分,都通过COM提供,可以在javascript,
陆勤_数据人网
2018/04/18
20K1
“喂,你要不要让自己试试看?”
大家下午好,我是编辑小堂妹,今天深圳天气蛮不错的,想和大家唠唠嗑。 好啦,步入正题,不知道大家有没有和我一样,热衷于借鉴成功人士的经验。 每次看到小马哥、马爸爸、强东哥的发家史,总觉得其中总有一些方法
腾讯大讲堂
2018/07/12
4070
我膨胀了,测试必要商城小程序,用了3种方式!:)
搜一搜:如果从来没有搜索过,在这里点击一下它,历史记录是空的。但是如果曾经搜索过,那一定有历史记录。如果不是第一次点击它,用自动化脚本再次点击的话,不会让你输入进去,会报错。
清菡
2020/12/16
5370
我膨胀了,测试必要商城小程序,用了3种方式!:)
腾讯能否拿下搜狐视频,要看张朝阳能否忍痛割爱
近日,新浪科技报道称,搜狐内部人士透露腾讯将以认购的方式向搜狐视频注资10亿美金,这一消息或于不久后宣布。这一交易与当年腾讯入股搜狗颇为相似:即腾讯将通过现金投资+业务注入的方式进行投资,具体来说,腾讯视频将于搜狐视频整合为新的“搜狐视频”,搜狐视频将以搜狐子公司独立运营。2013年-2014年,腾讯开展了一系列甩包袱的举措:2013年将搜搜搜索和输入法业务并入搜狗并入股后者;2014年将拍拍和易迅并入京东并入股后者。 不过,腾讯入股搜狐视频这一传言还是让人有几分疑惑。 腾讯视频不是包袱,为何要甩掉? 腾
罗超频道
2018/04/27
9650
全局资源编排下载系统,所有资源通通拿下!用NAS打造完美的追剧娱乐中心 - 熊猫不是猫QAQ
我相信大家手里NAS大部分都会用来搭建影视系统,不管你是用emby、jellyfin还是付费plex,这些系统都需要本地资源的支持,而本地资源哪儿来呢?部分人手机拥有很多PT站点,那么对于他们来说,资源很好找而且很及时。有新出的片子都能第一时间获取到。而对于没有PT站的人来说,只能去免费的站点了,但是都有NAS了,自然需要一套全自动服务了。于是乎Kubespider便诞生了。
熊猫不是猫
2023/07/20
1.3K0
全局资源编排下载系统,所有资源通通拿下!用NAS打造完美的追剧娱乐中心 - 熊猫不是猫QAQ
使用Huginn打造自动化云端信息助手
半年前我在简书上分享过一篇文章——Huginn 安装教程—建立你自己的 IFTTT,简单地介绍了一下Huginn到底是什么以及它部署到Heroku云平台上的方法。后来,我和利器群里结识的几个群友一起完成了Huginn教程的翻译;就在上个月,我们把这些教程都放到了网上(托管Github和Coding),于是就有了现在的Huginn中文网。但是,当我向其他人推荐这个开源应用时,大家还是不理解这个应用到底有大的用途,或者是有哪些有趣的玩法,恐怕就连Huginn这个单词很多人都不知道它的意思,更不要说它其中的典故。所以,我想结合我这近十个月左右的使用经验跟大家谈一谈它。
huginn 中文网
2019/03/20
2K0
百度终于入局小程序,会是哪些行业的红利?
在腾讯、阿里、谷歌、Facebook等互联网巨头以及十大手机巨头相继推出类小程序的应用平台后,百度日前正式入局。5月22日,在百度联盟峰会分论坛上,百度App业务部总经理平晓黎表示,百度将于7月正式推出百度智能小程序。
罗超频道
2018/07/23
5780
百度终于入局小程序,会是哪些行业的红利?
不仅仅是代码链接:arXiv联手Papers with Code,推出两项新功能
据官方推特消息,Papers With Code联合arXiv推出了代码链接功能,以后在上传arXiv论文的时候,就能顺便提交代码,不需要在论文里默默地加上链接,然后被忽略啦!
AI科技评论
2020/10/27
1.3K0
不仅仅是代码链接:arXiv联手Papers with Code,推出两项新功能
弹幕挖掘在综艺节目热点分析中的应用初探
作者:黄耀鹏, 腾讯PCG数据分析工程师 |导语 视频弹幕作为视频内容延伸、以及用户喜好反馈的一部分,有着巨大的挖掘价值。本文旨在通过运用文本挖掘技术,从弹幕中挖掘综艺节目热点话题,助力平台精准把握用户消费偏好、提升节目运营效率。 声明:本文运营方案相关的思考为个人观点,不代表腾讯视频既有运营方案和平台价值取向。本文仅纯粹作为个人感兴趣的技术研究总结。抛砖引玉,期待感兴趣的同学一起交流探讨。 1. 业务场景思考 1.1 视频弹幕的本质 弹幕文化,首先兴起于ACG社区等小众群体。而随着B站等弹幕视频网站的
腾讯大讲堂
2020/12/02
1.7K0
Chrome 浏览器扩展神器油猴
我平常工作最常用的浏览器就是 Chrome 了,Google 出品,值得信赖,用 Chrome 就不得不提浏览器扩展了,有了各种 Chrome 扩展,可以让你浏览器网页更方便,工作更高效。
不安分的猿人
2020/03/02
2.6K0
HTML5崛起之时,Java桌面时代就已经终结了
2004 年 Google Maps 的面世标志着 Java 桌面时代的终结,也改变了桌面环境下“跨平台”的基本定义。
深度学习与Python
2022/04/19
8400
35张PPT,教你快速成为数据分析师
我入行互联网的契机是做了一个“网站分析”的微博账号,做自媒体跟真正的实践者还是有很大距离的,所以推荐一个list的,如果你对网站分析有兴趣,可以专注这些大牛!
IT阅读排行榜
2018/08/16
6030
35张PPT,教你快速成为数据分析师
荐读|2016年上半年中国互联网广告运营商市场大数据
2016年上半年中国互联网广告运营商市场规模达1187.1亿元人民币,同比增长27.3%。 竞争格局方面,百度、阿里巴巴、腾讯分别位居市场前三位置。相较于第1季度,第2季度百度占比有所上升,占26.9
灯塔大数据
2018/04/09
1.1K0
荐读|2016年上半年中国互联网广告运营商市场大数据
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
远程控制的安全性已经算半个老生常谈的问题了,作为常年远程办公的人,这里我只想说一句,无论你用什么软件都会有安全上的隐患,做不到百分百的安全,但相对安全,咱们还是可以自主把控的。
海拥
2023/09/19
2K0
一文详解远程控制安全与远程控制软件(横测ToDesk\AnyDesk\向日葵)
【渗透技巧】资产探测与信息收集
另外,随着企业内部业务的不断壮大,各种业务平台和管理系统越来越多,很多单位往往存在着“隐形资产”,这些“隐形资产”通常被管理员所遗忘,长时间无人维护,导致存在较多的已知漏洞。
Bypass
2019/07/08
3K0
Docker搭建WordPress博客
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/101926.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/29
9380
Docker搭建WordPress博客
推荐阅读
相关推荐
邹良城:视频聚合类APP的网络版权侵权认定问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档