Python调用Jumpserver的Api接口增删改查
引言
Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。
1、什么是Jumpserver?
Jumpserver是一种堡垒机系统,它提供了一种安全且集中的方式来管理和控制用户对服务器的访问权限。Jumpserver可以帮助企业实现统一认证、审计日志记录、权限管理等功能,从而提高网络安全性。
2、Jumpserver提供的API接口
Jumpserver提供了一组强大的API接口,可以实现对跳板机的管理和操作。这些API包括获取服务器列表、认证访问权限、执行命令和文件传输等功能,可以通过HTTP请求进行调用。
目前使用的版本:v3.6.2
 不同步的版本,API 接口有变化
https://docs.jumpserver.org/zh/v3/dev/rest_api/
 

3、Python中的HTTP请求库
在Python中,我们可以使用第三方的HTTP请求库,如requests库或http.client库,来发送HTTP请求并获取响应。这些库提供了简洁的接口,方便我们与Jumpserver的API进行交互。
requests库:
 requests是一个功能强大、简单易用的第三方HTTP请求库,广泛应用于Python开发中。它提供了简洁的API,使得发送HTTP请求变得非常简单。使用requests库,我们可以发送各种类型的HTTP请求(GET、POST、PUT等),设置请求头、请求参数、请求体等,并能够获得服务器响应的状态码、内容等信息。
示例代码:
import requests# 发送GET请求并获取响应
response = requests.get('https://api.example.com/users')# 获取响应内容
content = response.text# 获取响应状态码
status_code = response.status_code
4、使用Python调用Jumpserver API进行认证
在使用Jumpserver的API之前,我们需要先进行认证。通常,Jumpserver会提供一个登录接口,我们可以使用用户名和密码进行登录,并获取到访问令牌(Access Token)。在后续的API请求中,我们需要将该访问令牌作为认证凭证。
 https://docs.jumpserver.org/zh/v3/dev/rest_api/#12
 
 推荐使用:Access Key方式 或者 Private Token
 
 
docker exec -it jms_core /bin/bash
cd /opt/jumpserver/apps
python manage.py shell
from users.models import User
u = User.objects.get(username='admin')
u.create_private_token()
已经存在 private_token,可以直接获取即可
u.private_token
此处我才用双层验证方式
KeyID = '77e76d19-141c-xxx-8d2b-xxxx'
SecretID = 'a04817bc-0bb1-439f-baa2-xxxx'
gmt_form = '%a, %d %b %Y %H:%M:%S GMT'
ptivate_token = 'xxxxxxxxxx'headers = {'accept': 'application/json','Content-Type': 'application/json',# 'X-CSRFToken': 'eoLo2AVcQK5X1JQ392JHCzjZ8wPCWZJFJao5O9ObH8zQwtiPhGBzaOnNKjaENShf',"Authorization": 'Token ' + ptivate_token,'X-JMS-ORG': '00000000-0000-0000-0000-000000000002','Date': datetime.datetime.utcnow().strftime(gmt_form)
}# 认证
def get_auth(KeyID, SecretID):"""认证:param KeyID:  The key ID:param SecretID:    The secret ID:return:"""signature_headers = ['(request-target)', 'accept', 'date']auth = HTTPSignatureAuth(key_id=KeyID, secret=SecretID, algorithm='hmac-sha256', headers=signature_headers)return authauth = get_auth(KeyID, SecretID)5、Jumpserver接口自动调用
获取所有用户
# 获取所有用户
def get_user_all():"""获取所有用户:return:"""url = jms_url + '/api/v1/users/users/'response = requests.get(url, auth=auth, headers=headers)user_list = json.loads(response.text)count = 0for i in user_list:count += 1print(i)print(count)
 获取监控指标
# 获取监控指标
def get_prometheus_metric():"""获取监控指标:return:"""url = jms_url + "/api/v1/prometheus/metrics/"response = requests.get(url, headers=headers, auth=auth)print(response.text)return response.text
获取所有资产节点
# 获取所有资产节点
def get_node_all():"""获取所有资产节点:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()查看当前token(即admin)的所有资产
def get_asset_all():"""查看当前token(即admin)的所有资产:return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()
创建资产节点
def assets_nodes_create(node_name):"""创建资产节点:param node_name::return:"""node_data = {"value": node_name}url = jms_url + "/api/v1/assets/nodes/"node_info = get_node_info(node_name)if node_info:  # 根据node_name去查询,如果查到了说明已经有了。print("{name}已存在, id: {id}".format(name=node_name, id=node_info[0]["id"]))else:data = json.dumps(node_data)resp = requests.post(url, headers=headers, data=data)return resp.json()根据ip获取资产信息
def get_assets_list_by_ip(ip):"""根据ip获取资产信息:param ip::return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, params={"ip": ip})print(response.json())return response.json()
查看资产节点信息
def get_node_info(node_name):"""查看资产节点信息:param node_name:   节点名称:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, auth=auth, headers=headers, params={"value": node_name})print(response.text)return response.json()
创建资产机器
# 创建资产机器
def asset_create(ip, hostname, node_id, comment):"""创建资产机器:param ip:  ip地址:param hostname:   主机名:param node_id:   节点id:return:    返回创建的资产信息"""asset_Data = {"name": hostname,"address": ip,"platform": "1","protocols": [{"name": "ssh","port": 22}],"is_active": True,"nodes": [node_id],"comment": comment,"accounts": [{# 账号模板id"template": "60b11033-a6e1-467d-8388-68a0e64134ff",}]}url = jms_url + "/api/v1/assets/hosts/"print(url)data = json.dumps(asset_Data)print(data)response = requests.post(url, auth=auth, headers=headers, data=data)print(response.text)运行创建服务器资产
# 运行创建服务器资产
def run_create_assets(node_name, project_name, ip, comment):"""运行创建服务器资产:param node_name:  节点名称:param project_name:  机器名称:param ip:  ip地址:param comment:  备注:return:"""# 节点id,无节点时创建节点node_info = get_node_info(node_name)# 如果len(node_info) == 0 说明没有节点,需要创建节点if len(node_info) == 0:# 创建节点node_id = assets_nodes_create(node_name)print(node_id)else:# 获取节点idnode_id = node_info[0]["id"]print(node_id)# 管理用户 idhostname = "{ip}_{project_name}".format(ip=ip, project_name=project_name)# 查IP,创建资产ip_info = get_assets_list_by_ip(ip)if ip_info:print("%s 已存在,nodes: %s" % (ip_info[0]["address"], ip_info[0]["nodes"]))else:asset_create(ip, hostname, node_id, comment)获取组织信息
def get_org_info():"""获取组织信息:return:"""url = jms_url + "/api/v1/orgs/orgs/"response = requests.get(url, headers=headers)org_list = response.textprint(org_list)for i in org_list.split("id"):print(i)return response.json()
6、完整代码
# -*- coding: utf-8 -*-
# @Time    : 2023/8/29 14:21
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : jms_add.py
# @Software: PyCharmimport requests, datetime, json
from httpsig.requests_auth import HTTPSignatureAuthKeyID = '77e76d19-141c-4545--xxx'
SecretID = 'a04817bc-0bb1-439f-baa2-xxxx'
gmt_form = '%a, %d %b %Y %H:%M:%S GMT'
ptivate_token = 'xxxxx'headers = {'accept': 'application/json','Content-Type': 'application/json',# 'X-CSRFToken': 'eoLo2AVcQK5X1JQ392JHCzjZ8wPCWZJFJao5O9ObH8zQwtiPhGBzaOnNKjaENShf',"Authorization": 'Token ' + ptivate_token,'X-JMS-ORG': '00000000-0000-0000-0000-000000000002','Date': datetime.datetime.utcnow().strftime(gmt_form)
}# 认证
def get_auth(KeyID, SecretID):"""认证:param KeyID:  The key ID:param SecretID:    The secret ID:return:"""signature_headers = ['(request-target)', 'accept', 'date']auth = HTTPSignatureAuth(key_id=KeyID, secret=SecretID, algorithm='hmac-sha256', headers=signature_headers)return authauth = get_auth(KeyID, SecretID)# 获取所有用户
def get_user_all():"""获取所有用户:return:"""url = jms_url + '/api/v1/users/users/'response = requests.get(url, auth=auth, headers=headers)user_list = json.loads(response.text)count = 0for i in user_list:count += 1print(i)print(count)# 获取监控指标
def get_prometheus_metric():"""获取监控指标:return:"""url = jms_url + "/api/v1/prometheus/metrics/"response = requests.get(url, headers=headers, auth=auth)print(response.text)return response.text# 获取所有资产节点
def get_node_all():"""获取所有资产节点:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()# 查看当前token(即admin)的所有资产
def get_asset_all():"""查看当前token(即admin)的所有资产:return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, auth=auth)node_list = json.loads(response.text)count = 0for i in node_list:count += 1print(i)print(count)return response.json()###################################################################################################
# 创建资产节点
def assets_nodes_create(node_name):"""创建资产节点:param node_name::return:"""node_data = {"value": node_name}url = jms_url + "/api/v1/assets/nodes/"node_info = get_node_info(node_name)if node_info:  # 根据node_name去查询,如果查到了说明已经有了。print("{name}已存在, id: {id}".format(name=node_name, id=node_info[0]["id"]))else:data = json.dumps(node_data)resp = requests.post(url, headers=headers, data=data)return resp.json()#
def get_assets_list_by_ip(ip):"""根据ip获取资产信息:param ip::return:"""url = jms_url + "/api/v1/assets/assets/"response = requests.get(url, headers=headers, params={"ip": ip})print(response.json())return response.json()# 查看资产节点信息
def get_node_info(node_name):"""查看资产节点信息:param node_name:   节点名称:return:"""url = jms_url + "/api/v1/assets/nodes/"response = requests.get(url, auth=auth, headers=headers, params={"value": node_name})print(response.text)return response.json()# 创建资产机器
def asset_create(ip, hostname, node_id, comment):"""创建资产机器:param ip:  ip地址:param hostname:   主机名:param node_id:   节点id:return:    返回创建的资产信息"""asset_Data = {"name": hostname,"address": ip,"platform": "1","protocols": [{"name": "ssh","port": 22}],"is_active": True,"nodes": [node_id],"comment": comment,"accounts": [{# 账号模板id"template": "60b11033-a6e1-467d-8388-68a0e64134ff",}]}url = jms_url + "/api/v1/assets/hosts/"print(url)data = json.dumps(asset_Data)print(data)response = requests.post(url, auth=auth, headers=headers, data=data)print(response.text)# 运行创建服务器资产
def run_create_assets(node_name, project_name, ip, comment):"""运行创建服务器资产:param node_name:  节点名称:param project_name:  机器名称:param ip:  ip地址:param comment:  备注:return:"""# 节点id,无节点时创建节点node_info = get_node_info(node_name)# 如果len(node_info) == 0 说明没有节点,需要创建节点if len(node_info) == 0:# 创建节点node_id = assets_nodes_create(node_name)print(node_id)else:# 获取节点idnode_id = node_info[0]["id"]print(node_id)# 管理用户 idhostname = "{ip}_{project_name}".format(ip=ip, project_name=project_name)# 查IP,创建资产ip_info = get_assets_list_by_ip(ip)if ip_info:print("%s 已存在,nodes: %s" % (ip_info[0]["address"], ip_info[0]["nodes"]))else:asset_create(ip, hostname, node_id, comment)def get_org_info():"""获取组织信息:return:"""url = jms_url + "/api/v1/orgs/orgs/"response = requests.get(url, headers=headers)org_list = response.textprint(org_list)for i in org_list.split("id"):print(i)return response.json()if __name__ == '__main__':jms_url = 'https://jms.xxx.top'username = 'admin'password = 'xxxxxx'# 获取token# token = get_token(jms_url, username, password)# 创建资产节点# assets_nodes_create("k8s")# 根据ip获取资产信息# get_assets_list_by_ip("192.168.11.10")# 查看资产节点信息# get_node_info("k8s")# 创建资产调用# node_id = ["e8641c37-93e3-450e-aaf8-64d5baa69753"]# get_node_info("k8s")# asset_create(ip, hostname, node_id)# 运行创建服务器资产# run_create_assets("test", "风控", "192.168.11.10", "测试")# 获取组织信息# get_org_info()# 获取所有用户get_user_all()
相关文章:
 
Python调用Jumpserver的Api接口增删改查
引言 Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。 1、什么是Jumpserver&#…...
后端入门教程:从零开始学习后端开发
1. 编程基础 首先,作为一名后端开发者,你需要掌握至少一门编程语言。Python是一个很好的选择,因为它易于学习且功能强大。让我们从一个简单的示例开始,在控制台输出 "Hello, World!"。 2. 学习Web基础 了解Web开发基…...
 
无涯教程-JavaScript - DB函数
描述 DB函数使用固定余额递减法返回指定期间内资产的折旧。 语法 DB (cost, salvage, life, period, [month])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvageThe value at the end of the depreciation (sometimes called the salv…...
 
2023年财务顾问行业研究报告
第一章 行业概况 1.1 定义及分类 财务顾问(Financial Advisor,FA)也被称为融资顾问,主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色,为双方搭建桥梁,确保投…...
2023SICTF ROUND2 baby_heap
附件:baby_heap libc版本:glibc2.23 思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bi…...
 
buuctf crypto 【密码学的心声】解题记录
1.打开可以看到一个曲谱 2.看到曲谱中的提示埃塞克码可以想到ascii码,没有八可以联想到八进制,而八进制又对应着三位的二进制,然后写个脚本就好了 oct [111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,…...
 
论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目:简单黑盒对抗攻…...
 
41 个下载免费 3D 模型的最佳网站
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台,提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板,演示幻灯片,视频和音乐等。您可以找到不同的3D模型,例如婚礼装饰&…...
 
SpringMVC之JSR303和拦截器
认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...
 
通过rabbitmq生成延时消息,并生成rabbitmq镜像
通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...
结构型模式-外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系…...
 
vue三个点…运算符时报错 Syntax Error: Unexpected token
出现以下问题报错: 解决: 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }...
 
C# wpf 实现桌面放大镜
文章目录 前言一、如何实现?1、制作无边框窗口2、Viewbox放大3、截屏显示(1)、截屏(2)、转BitmapSource(3)、显示 4、定时截屏 二、完整代码三、效果预览总结 前言 做桌面截屏功能时需要放大镜…...
Mybatis中的#{}和${}的区别
#{}和${}他们两都是替换参数的作用,但也还是有很大区别的。 目录 一、${} 二、#{} 三、注意点 一、${} 它是直接替换过来,不添加其它的什么。 比如下面的sql语句 select *from user where id${id} 如果id1,那么他替换过来就还是1ÿ…...
 
选择(使用)数据库
MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: use 数据库名称;大家应该知道,在对数据库进行操作的时候,要制定数据库的操作对象,也就是说操作哪一个数据库 案列:选择testing数据库 …...
 
GFS分布式文件系统
1、GlusterFS简介 GlusterFS(GFS)是一个开源的分布式文件系统 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据…...
 
虚函数、纯虚函数、多态
一.虚函数 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象的实际类型来调用相应的函数,如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。 …...
 
QGIS学习3 - 安装与管理插件
QGIS安装与管理插件主要是使用了菜单栏安装与管理插件这个菜单。 1、通过压缩文件等添加非官方插件 通过压缩文件添加有可能会提示存在安全问题等,直接点是即可。 之后点击install plugins即可完成。安装后导入插件 但是load失败了应该是安装没有成功。只能通过u…...
LeetCode377. 组合总和 Ⅳ
377. 组合总和 Ⅳ 文章目录 [377. 组合总和 Ⅳ](https://leetcode.cn/problems/combination-sum-iv/)一、题目二、题解方法一:完全背包一维数组动态规划思路代码分析 方法二:动态规划二维数组 一、题目 给你一个由 不同 整数组成的数组 nums ࿰…...
QT将数据写入文件,日志记录
项目场景: 在QT应用中,有时候需要将错误信息记录在log文件里面,或者需要将数据输出到文件中进行比对查看使用。 创建log文件,如果文件存在则不创建 QDir dir(QCoreApplication::applicationDirPath()"/recv_data");if(…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
 
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
 
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
 
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
