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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125175.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Tcp编程

网络连接与通信是我们学习任何编程语言都绕不过的知识点。Python 也不例外,本文就介绍因特网的核心协议 TCP ,以及如何用 Python 实现 TCP 的连接与通信。 TCP 协议 TCP协议(Transmission Control Protocol, 传输控制协议&#…

code阶段——gitgitlab安装

在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装 https://git-scm.com/(傻瓜式安装) GitLab安…

leetcode 143. 重排链表

2023.9.5 先将链表中的节点存储到数组中,再利用双指针重新构造符合条件的链表。代码如下: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNod…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分:表级锁、页级锁、行锁 为了提高数据库并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但管理锁是很耗资源(涉及获取、检查、释放锁等动作)。因…

统一潮流控制器 (UPFC) 的应用,以增强电力系统中的电压稳定性(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

智能机器人:打造自动化未来的关键技术

文章目录 1. 智能机器人的基本概念2. 智能机器人的关键技术2.1 机器视觉2.2 机器学习与深度学习2.3 传感器技术 3. 智能机器人的应用领域3.1 制造业3.2 医疗保健3.3 农业3.4 服务业 4. 智能机器人的未来趋势4.1 自主决策能力的提升4.2 协作与互操作性4.3 个性化定制4.4 环境感知…

4.矩阵的几何意义、变基与迹

文章目录 变基操作与矩阵矩阵的迹几何意义矩阵迹的几条性质 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 变基操作与矩阵 我们知道空间中一点的坐标可以表示以原点为起点以该点为终点的向量。 以二维平面为例,如下图 选取…

对可再生能源和微电网集成研究的新控制技术和保护算法进行基线和测试及静态、时域和频率分析研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

在VScode中如何将界面语言设置为中文

VSCode安装后的默认界面是只有英文的,如果想用中文界面,那么就需要安装对应的插件,vscode插件可以从扩展中心去搜索并安装。 安装vscode后打开vscode,点击左侧的扩展按钮。 在搜索框中输入chinese,弹出chinese&#x…

1.2 向量代数

1.向量的概念 定义: 既有大小,又有方向。 向量的表示法 记有向线段的起点A与终点B,从点A指向B的箭头表示了这条线端的方向,线段的长度表示了这条线段的大小,向量就可用这样的一条有向线段来表示, 记作&a…

4. xaml Button按钮

1.运行图片 2.源码 <Grid><!--BorderBrush="BlueViolet" 边框颜色--><!--BorderThickness="2" 边框线的粗细--><

ROS2学习(一):Ubuntu 22.04 安装 ROS2(Iron Irwini)

文章目录 一、ROS2(Iron Irwini)介绍二、ROS2(Iron Irwini)安装1.设置编码2.使能代码库3.安装ROS2 Iron 三、ROS2测试四、ROS2卸载 一、ROS2(Iron Irwini)介绍 官方文档 Iron Irwini版本支持的平台如下&#xff1a; 二、ROS2(Iron Irwini)安装 1.设置编码 sudo apt update…

花生壳内网穿透+Windows系统,如何搭建网站?

1. 准备工作 在百度搜索“Win7下安装ApachePHPMySQL”&#xff0c;根据搜到的教程自行安装WAMP环境。 如果在网页上键入http://127.0.0.1/ 出现以下页面表示您的服务器已经建好&#xff0c;下一步就是关键&#xff0c;如何通过花生壳内网穿透&#xff0c;让外网的用户访问到您…

MySQL聚簇索引与非聚簇索引

分析&回答 当数据库一条记录里包含多个字段时&#xff0c;一棵B树就只能存储主键&#xff0c;如果检索的是非主键字段&#xff0c;则主键索引失去作用&#xff0c;变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。这个索引由独立的B树来组织。有两种常见的方…

pyCharm远程DEBUG

第一步&#xff0c;添加一个远程机器的解释器 ssh 远程机器解释器添加&#xff0c; 我本地ssh有配置目标机器。 如果没配置&#xff0c;那就选着new server configuration 新增一个。 interpreter 指定远程机器python&#xff0c; &#xff08;机器上有多个版本python里尤其要…

SQL Server如何新建作业

作业&#xff1a; 在 SQL Server 中&#xff0c;作业&#xff08;Job&#xff09;是一组可以在预定时间自动执行的任务。可以将作业看作是一个可以在后台运行的程序或脚本。作业由一系列步骤组成&#xff0c;每个步骤都是一个独立的任务&#xff0c;可以执行诸如执行 SQL 查询…

SpringMvc入门

目录 1.什么是SpringMvc 2.SpringMVC工作流程 3.SpringMVC核心组件 4.SpringMvc入门 添加依赖 编写spring-mvc.xml 编写IndexController类 编写jsp 编写web.xml 测试结果 5.静态资源处理 编写Spring-mvc.xml 测试结果 ​编辑 1.什么是SpringMvc Spring MVC是一个…

判断一个点是否在一个多边形内部

1 原理 如下图所示&#xff0c; 四边形ABCD, P在四边形内部&#xff0c;Q在四边形外部。 通过观察可以发现&#xff0c; 当点在四边形内部时&#xff0c; 如果按顺时针方向的话&#xff0c; 点P在四条边AB&#xff0c; BC, CD, DA的右侧。 当然如果按逆时针的话&#xff0c; 点…

Windows10上使用llama-recipes(LoRA)来对llama-2-7b做fine-tune

刚刚在Windows10上搭建环境来对llama2做finetune&#xff0c;里面坑还是挺多的&#xff0c;这里把印象中的坑整理了一下以作备忘。 llama-recipes是meta的开源项目&#xff0c;Github地址为&#xff1a;GitHub - facebookresearch/llama-recipes: Examples and recipes for Ll…

C# OpenCvSharp 通道分离

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.Extensions;namespac…