Python调用Jumpserver的Api接口增删改查

news2024/11/25 4:22:45

引言

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 auth


auth = 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 = 0
   for i in user_list:
       count += 1
       print(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 = 0
    for i in node_list:
        count += 1
        print(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 = 0
    for i in node_list:
        count += 1
        print(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:
        # 获取节点id
        node_id = node_info[0]["id"]
        print(node_id)
    # 管理用户 id
    hostname = "{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.text
    print(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: PyCharm


import requests, datetime, json
from httpsig.requests_auth import HTTPSignatureAuth

KeyID = '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 auth


auth = 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 = 0
    for i in user_list:
        count += 1
        print(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 = 0
    for i in node_list:
        count += 1
        print(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 = 0
    for i in node_list:
        count += 1
        print(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:
        # 获取节点id
        node_id = node_info[0]["id"]
        print(node_id)
    # 管理用户 id
    hostname = "{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.text
    print(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.coloradmin.cn/o/973907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

气传导耳机怎么样?市面上热门气传导耳机推荐

​气传导耳机不仅能够提升幸福感还能听到周围环境声,大大提高安全性。如果你在寻找一款高品质的气传导耳机,又不知从何入手时,不要担心,我已经为你精心挑选了四款市面上综合表现很不错的气传导耳机,让你享受更好的音质…

达梦类型转换问题-float转换为varchar

表结构 CREATE TABLE "SYSDBA"."TABLE_2" ( "COLUMN_1" FLOAT, "COLUMN_2" NUMERIC(22,6)) STORAGE(ON "MAIN", CLUSTERBTR) ; 表数据: 查询,将numeric转换为float,再转换为varchar&…

Spring Boot 整合 Redis,使用 RedisTemplate 客户端

文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…

通讯行业:看完这篇文章,我的认知被刷新了!

在现代社会中,通讯系统已经成为我们生活中不可或缺的一部分,它们支撑着信息传递、数据交流和社交互动。然而,通讯系统的可靠性和连续性依赖于电源的稳定供应。电源中断或波动可能导致通讯中断,给个人、企业和组织带来巨大的不便和…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…

港陆证券:服装家纺公司上半年投资并购力度加大

9月1日,嘉曼服饰发布公告,为完善多品牌差异化开展战略,将以自有资金收买暇步士(Hush Puppies)品牌我国内地及香港、澳门区域IP财物。 面对服饰市场的激烈竞争,本年以来一些服饰类A股公司开启了“买买买”形…

西贝餐饮集团贺赞贤:Smartbi及指标体系的应用助力销供产业务协同

“传统的供应链数字化运营,是自下而上的需求驱动,存在效率低下、口径不统一、分析不敏捷等问题。西贝亟需自上而下构建完善科学的指标体系,实现敏捷、灵活、统一的应用。因此借助Smartbi以指标为核心的一站式ABI平台,梳理指标体系…

Spring事务(ACID特性、隔离级别、传播机制、失效场景)

一、事务的ACID特性 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。一致性(Consistency) 事务前后数据的完整性必须保持一致。隔离性(Isola…

数据库概念

定义: 数据库(Database 简称DB)是持久存储有组织/可共享数据/的容器 数据库管理系统(MySQL、Oracle、DB2)是操作/和管理数据库/的软件 分类: 关系(型)数据库 (MySQL、Oracle、SQL Server、SQLite、DB2) 非关系(型)数据库 (Redis…

大模型 Dalle2 学习三部曲(二)Latent Diffusion Models学习

引言 Diffusion model大获成功,但是它的短板也很明显,需要大量的计算资源,并且推理速度比较慢。如何才能提升Diffusion model的计算效率。业界有各种各样的改进,无疑Latent Diffusion Models(潜在扩散模型,…

基于Java+SpringBoot+Vue前后端分离善筹网(众筹)设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Bootstrap的行、列布局设计(网络系统设计)

目录 00-基础知识01-等宽列布局02-指定某一列的宽度03-根据内容自动改变列的宽度04-五种预定义列宽度 .col、.col-sm-*、.col-md-*、.col-lg-*、.col-xl-*05-不同视口宽度按不同的分列方案划分06-删除列内容的盒模型的外边距07-超过12列怎么办?08-重新排列各列的顺序…

【数据结构初阶】一. 复杂度讲解

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十四天【程序环境和预处理】_高高的胖子的博客-CSDN博客 1 . 算法效率 (1). 什么是数据结构: 数据结构(Data Structure)是计算机存储、…

MyBatis Plus 学习笔记

MyBatis Plus 国产的开源框架,基于 MyBatis 核心功能就是简化 MyBatis 的开发,提高效率。 MyBatis Plus 快速上手 Spring Boot(2.3.0) MyBatis Plus(国产的开源框架,并没有接入到 Spring 官方孵化器中) 1、创建 …

Grad-CAM 小陈读paper系列(摘要加引言)

Abstract 我们提出了一种基于卷积神经网络 (CNN) 的模型的决策生成“视觉解释”的技术,使它们更加透明。我们的方法——梯度加权类激活映射(Grad-CAM), 使用任何目标概念的梯度(例如“狗”甚至标题的 logits&#xf…

新品登场!雅特力发布AT32F402与AT32F405高速USB2.0 OTG MCU

因应高速USB市场需求,产品技术不断推陈出新,USB2.0发展带来的高速连接能力,优化消费者的产品使用体验,且由于支持即插即用和热插拔,提高设备易用性,USB接口在各项设备中成为主流通用接口。在USB2.0标准中&a…

网站做SEO为什么见效慢?都有哪些原因导致?

SEO是一种具有一定运营周期的网络营销模式,与其他网络营销方式不同,它在短时间内可能不会产生营销效果,因为网站SEO优化是一项依赖于积累和坚持的工作。一般来说,搜索引擎优化的结果在一年左右会更加稳定。之所以在一些情况下见效…

【⑰MySQL】 变量 | 循环 | 游标 | 处理程序

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构3.2 循环结构3.3 跳转…

leaflet · 初体验

首先关于地图的组件有很多,leaflet就是其一,Leaflet 是一个开源的 JavaScript 库,用于在网页上创建交互式地图。它提供了一系列易于使用的函数和方法,使开发者可以轻松地添加地图、标记、图层和交互功能。 通过命令下载插件l…

Astro建站教程:安装nodejs,npm下载Astro,安装扩展

下载Nodejs LTS版:https://nodejs.org/en 安装步骤全默认即可,安装路径可以根据自己的爱好更改在桌面右键打开cmd或powershell,输入node -v和npm -v测试是否安装成功 浏览器打开https://docs.astro.build/en/install/auto/ 复制里面的npm cre…