iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python通过跳板机访问数据库的方法
  • 371
分享到

Python通过跳板机访问数据库的方法

2024-04-02 19:04:59 371人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

什么是跳板机? 跳板机(Jump Server):也称堡垒机,是一类可作为跳板批量操作的远程设备的网络设备,是系统管理员和运维人员常用的操作平台之一。 那么具体是做什么的呢? 现在一

什么是跳板机?

跳板机(Jump Server):也称堡垒机,是一类可作为跳板批量操作的远程设备的网络设备,是系统管理员和运维人员常用的操作平台之一。
那么具体是做什么的呢?
现在一些比较大的互联网企业,往往拥有大量的服务器,为了能够统一方便管理,运维人员通过跳板机去管理对应的服务器。我们在访问服务器的时候,先通过登陆跳板机,然后再进入相应服务器。从一定程度上提升了服务器的数据安全性,也提升了服务器的可维护性。

sshtunnel 连接堡垒机

跳板机的本质还是ssh连接,通过paramiko 自己造轮子的话理论也是可以实现的,这边推荐 sshtunnel 这个包,省的自己写了。
理解了跳板机的原理,这边的配置就比较好理解了。拿这张图举例,首先需要先访问跳板机,其实就是最常见的ssh连接,可以是账户密码,也可以是密钥登录的,如果是密钥的话需要在 跳板机的.ssh 目录下的某个许可文件中添加上自己的公钥

建立ssh通道模版

最后还需要补充一下 目标主机的ip 和端口。理解了这些,以下的这些参数就知道怎么配置了,
local_bind_address 可以不配置,不配置会随机获取本地的端口号,如果指定的话就会占用本地固定的端口号,推荐配置这一参数。
填写本地的端口是因为这边会将目标服务器ip的端口映射为本地端口,然后访问本地端口就能实现目标端口的访问了。


from sshtunnel import SSHTunnelForwarder
server = SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板机的配置
        ssh_pkey=ssh_pk_jump, 
        #密钥的访问方式,如果是密码 ssh_passWord=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_Mysql, int(port_mysql)))  # 数据库服务器的配置
        local_bind_address=(local_ip, local_port)  # 开启本地转发端口
        )
	server.start()
	server.close()

有些人习惯用 上下文管理器,看起来更舒服些


from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板机的配置
        ssh_pkey=ssh_pk_jump, 
        #密钥的访问方式,如果是密码 ssh_password=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_mysql, int(port_mysql)))  # 数据库服务器的配置
        local_bind_address=(local_ip, local_port)  # 开启本地转发端口
        )as server
	server.start()

连接数据库

建立好通道后就能通过本地映射的端口访问目标的数据库端口了。
常见的mysql 数据库访问 比如 mysqldb,pymysql,mysql.connector,
mysqldb跟 pymysql 差不多,只不过前者适用python2的版本,后者适用python3的版本,mysql.connector是官方推荐的。
pymysql 跟 mysql.connector 还是有一些区别的
我这边使用的是 mysql.connector ,在实践中老是无法连接上,而pymysql却是可以的。
最终终于找到了解决办法。。。

在这里插入图片描述

以下是我的mysql.connector 连接数据库的样例。


with SSHTunnelForwarder(
        (host_jump, int(port_jump)),  # 跳板机的配置
        ssh_pkey=ssh_pk_jump, 
        #密钥的访问方式,如果是密码 ssh_password=???
        ssh_username=user_name_jump,
        remote_bind_address=(host_mysql, int(port_mysql)))  # 数据库服务器的配置
        local_bind_address=(local_ip, local_port)  # 开启本地转发端口
        )as server
	server.start()
    conn = mysql.connector.connect(**{'host': '127.0.0.1',
                              'port': server.local_bind_port,
                              'user': dbcfg["user"],
                              'password': dbcfg["password"],
                              'db': dbcfg["db"],
                              'charset': dbcfg["charset"],
                              'collation': dbcfg["collation"],
                              'use_unicode': dbcfg["use_unicode"],
                              'use_pure': True})
        cursor = conn.cursor(dictionary=True)
        cursor.execute(sql, params)
        rows = cursor.fetchall()
        # conn.commit()
        cursor.close()
        conn.close()

这样,数据库就能正常访问啦

代码重构和优化

首先,就上面这样的代码而言,在每次查询都需要进行跳板机的连接,对于短时间突然大量请求的情况,这种是效率极低的。所以最好是能够将建立管道保存下来。
其次,如果同时访问多种数据库的情况,存在有无跳板机的场景,所以最好能够先将所有的数据库都进行连接,将conn保存在字典中,根据要访问的机器调用对应的conn,最后再统一释放。


def get_slave_conn_byProxy(dbcfg):
    server = SSHTunnelForwarder(
        eval(dbcfg["addr"]),
        ssh_username=dbcfg["ssh_username"],
        ssh_pkey=os.getenv("HOME") + "/.ssh/id_rsa",
        remote_bind_address=eval(dbcfg["remote_bind_address"]),
        local_bind_address=eval(dbcfg["local_bind_address"])  # 开启本地转发端口
    )
    server.start()
    conn = get_db_connection({'host': '127.0.0.1',
                              'port': server.local_bind_port,
                              'user': dbcfg["user"],
                              'password': dbcfg["password"],
                              'db': dbcfg["db"],
                              'charset': dbcfg["charset"],
                              'collation': dbcfg["collation"],
                              'use_unicode': dbcfg["use_unicode"],
                              'use_pure': True})
    return server, conn

def get_db_connection(dbcfg):
    # logger.info(f"============ debug db config: {dbcfg}")
    conn = mysql.connector.connect(**dbcfg)
    return conn

# 通过输入的连接参数判断是否需要通过跳板机的方式
def get_slave_conn(dbcfg):
    if "addr" in dbcfg:
        return get_slave_conn_byProxy(dbcfg)
    else:
        conn = get_db_connection(dbcfg)
        return None, conn
       
def read_slave_db_data(sql, conn, params=None, use_pdf=True):
        cursor = conn.cursor(dictionary=True)
        cursor.execute(sql, params)
        rows = cursor.fetchall()
        # conn.commit()
        cursor.close()
        if use_pdf:
            return pd.DataFrame(rows)
        else:
            return rows

到此这篇关于Python通过跳板机访问数据库的文章就介绍到这了,更多相关Python跳板机访问数据库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python通过跳板机访问数据库的方法

本文链接: https://www.lsjlt.com/news/155808.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python通过跳板机访问数据库的方法
    什么是跳板机? 跳板机(Jump Server):也称堡垒机,是一类可作为跳板批量操作的远程设备的网络设备,是系统管理员和运维人员常用的操作平台之一。 那么具体是做什么的呢? 现在一...
    99+
    2024-04-02
  • Python通过跳板机访问数据库的方法是什么
    本篇内容主要讲解“Python通过跳板机访问数据库的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python通过跳板机访问数据库的方法是什么”吧!什么是跳板机?跳板机(Jump Se...
    99+
    2023-06-25
  • 使用JSCH框架通过跳转机访问其他节点的方法
    之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务。在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API。但是看的云里雾里的。联想了下,端口转发的原理是否是把目标节点ip:port映射到l...
    99+
    2023-05-30
    jsch 跳转机 访问
  • Python 通过pymssql访问查询操作 SQL Server数据库
    在企业应用开发中,经常用到应用程序访问数据库的开发模式,中小企业使用的数据库中,以ms SQL Server居多。本文就以一个简单的实例模型,简单介绍一下python访问ms sql sever数据库...
    99+
    2023-09-24
    数据库 python qt5 sqlserver
  • 怎么通过外网访问mysql数据库
    通过外网访问mysql数据库的方法:默认安装并启动MySQL数据库,端口是3306。下载并解压holer软件包,地址:https://github.com/wisdom-projects/holer/tree/master/Binary/G...
    99+
    2024-04-02
  • 如何通过ADO控件访问数据库
    今天就跟大家聊聊有关如何通过ADO控件访问数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。下面以Microsoft Office&nb...
    99+
    2024-04-02
  • 登录EasyConnect后无法通过jdbc访问服务器数据库问题的解决方法
    目录问题描述:解决方案:总结问题描述: 通过EasyConnect登录后可以用xshell连接服务器,同时可以使用navicat和pymysql连接mysql数据库(无论是何数据库,...
    99+
    2023-02-24
    jdbc无法连接 jdbc访问服务器数据库 jdbc连接不到数据库
  • .Net ORM 访问 Firebird 数据库的方法
    目录前言1、安装环境2、创建项目3、创建实体模型4、初始化 ORM5、插入数据6、更新数据7、查询数据8、删除数据结语前言 Firebird 是一个跨平台的关系数据库系统,目前能够运...
    99+
    2024-04-02
  • 数据库安全堡垒:通过访问控制巩固您的数据
    ...
    99+
    2024-04-02
  • Python访问MySQL数据库速度慢的解决方法
    本篇内容介绍了“Python访问MySQL数据库速度慢的解决方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!python可以做什么Pyth...
    99+
    2023-06-14
  • 通过holer怎么从外网访问本地数据库
    通过holer怎么从外网访问本地数据库,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 准备工作1.1 安装并启动数据库默认安装的数据库端口...
    99+
    2024-04-02
  • php访问数据库的方法有哪些
    在PHP中,可以使用以下几种方法来访问数据库:1. 使用MySQLi扩展:MySQLi扩展是PHP官方推荐的访问MySQL数据库的方...
    99+
    2023-10-10
    php 数据库
  • java访问数据库的方法有哪些
    Java访问数据库的方法有以下几种:1. JDBC(Java Database Connectivity):JDBC是Java访问数...
    99+
    2023-09-22
    数据库 java
  • J2ME通过Servlet访问数据库的步骤分别是怎样的
    本篇文章为大家展示了J2ME通过Servlet访问数据库的步骤分别是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。你知道J2ME访问数据库的方式吗,这里向大家...
    99+
    2024-04-02
  • VB中数据库访问的方法有哪些
    在VB中,可以使用以下方法来访问数据库: ADO(ActiveX Data Objects):ADO是一种用于访问数据库的COM...
    99+
    2024-04-03
    VB
  • Mybatis通过Mapper代理连接数据库的方法
    1.在数据库中创建表和相应字段,如下图我创建了三个字段分别为fromname,message,toname,类型为varchar 2.创建对应的pojo实体类,注意类型要和数据库创...
    99+
    2024-04-02
  • PostgreSQL通过oracle_fdw访问Oracle数据的示例分析
    这篇文章给大家分享的是有关PostgreSQL通过oracle_fdw访问Oracle数据的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。背景:同一个项目两个系统分别使用了PG库和Oracle库,Orac...
    99+
    2023-06-15
  • 登录EasyConnect后无法通过jdbc访问服务器数据库如何解决
    这篇文章主要介绍“登录EasyConnect后无法通过jdbc访问服务器数据库如何解决”,在日常操作中,相信很多人在登录EasyConnect后无法通过jdbc访问服务器数据库如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-07-05
  • PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
    背景: 同一个项目两个系统分别使用了PG库和Oracle库,Oracle是生产库,数据动态更新,现在在PG库中需要实时的获取到更新的数据进行统计,基于此种方式,可以通过ETL的工具实...
    99+
    2024-04-02
  • springboot整合mybatis并访问数据库的过程
    这篇文章主要讲解了“springboot整合mybatis并访问数据库的过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot整合mybatis并访问数据库的过程”吧!引入依...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作