Python利用SSH隧道实现数据库访问

 更新时间:2025年03月08日 11:50:08   作者:Java菜鸟在北京  
这篇文章主要为大家详细介绍了如何通过sshtunnel类库建立SSH隧道,再使用paramiko通过SSH来访问数据库,感兴趣的小伙伴可以跟随小编一起学习一下

本文介绍通过sshtunnel类库建立SSH隧道,使用paramiko通过SSH来访问数据库。

实现了两种建立SSH方式:公私钥验证、密码验证。

公私钥可读本地,也可读取Aws S3上的私钥文件。

本质上就是在本机建立SSH隧道,然后将访问DB转发到本地SSH内去访问数据库。

简单易懂,上代码:

from sshtunnel import SSHTunnelForwarder
from sqlalchemy import create_engine, text
import paramiko
import io
import socket
 
#### 都换成你自己的
# SSH配置 
ssh_host = '' #主机
ssh_port = 22  #端口
ssh_user = 'ec2-user' #用户名
ssh_password = ''  #密码(如果是密码验证)
ssh_key_path = r'C:\Users\Desktop\test_primi.pem' #私钥本地地址(如果是公私钥验证)
# 数据库配置
database_user = '' #用户名
database_password = '' #密码
database_name = '' #数据库名
database_host = '' #主机
database_port = 3306 #端口号
 
def get_available_port():
    """
    获取可用的本地端口。
    """
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        sock.bind(('127.0.0.1', 0))
        port = sock.getsockname()[1]
    finally:
        sock.close()
    return port
 
try:
    #读取S3上的私钥
    # s3_client = get_s3_client()
    # response = s3_client.get_object(Bucket='桶名称', Key='私钥在S3上的key')
    # private_key_content = response['Body'].read().decode('utf-8')
    #private_key = paramiko.RSAKey.from_private_key(io.StringIO(private_key_content))
    #读取本地私钥
    private_key = paramiko.RSAKey.from_private_key_file(ssh_key_path)
    local_port = get_available_port()
 
    # 创建 SSH 隧道
    tunnel= SSHTunnelForwarder(
            (ssh_host, ssh_port),
            ssh_username=ssh_user,
            ssh_pkey=private_key,
            #ssh_password=ssh_password,
            remote_bind_address=(database_host, database_port),
            local_bind_address=('127.0.0.1', local_port),
            host_pkey_directories=[]
    )
    try:
        # 启动 SSH 隧道
        tunnel.start()
        # 连接数据库
        engine = create_engine(
            f'mysql+pymysql://{database_user}:{database_password}@127.0.0.1:{local_port}/{database_name}')
        # 测试数据库连接
        with engine.connect() as connection:
            result = connection.execute(text("SELECT count(*) from activity_logs"))
            for row in result:
                print(row)
    finally:
        # 关闭 SSH 隧道
        tunnel.stop()
except Exception as e:
    print(f"出现错误: {e}")

执行结果: 

成功输出条数

 注意:host_pkey_directories=[] 的意思是 不要在指定的目录中寻找密钥,如果没有将出现如下错误,但不影响程序正常执行。

可以先在本地用Navicat之类的客户端测好了,sshtunnel应该是三种验证方法都支持的,源码如下

到此这篇关于Python利用SSH隧道实现数据库访问的文章就介绍到这了,更多相关Python SSH访问数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pytorch微调BERT实现命名实体识别

    Pytorch微调BERT实现命名实体识别

    命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种 NLP 任务中显著提高了性能,包括 NER,在本文中,我们将展示如何使用 PyTorch 对预训练的 BERT 模型进行微调,以用于 NER 任务
    2025-03-03
  • Python中打包和拆包的流程详解

    Python中打包和拆包的流程详解

    在 Python 编程中,打包(packing)与拆包(unpacking)非常实用,它们能让代码更简洁、可读性更高,尤其在处理序列、字典以及函数参数传递时发挥着巨大作用,本文将带你全面理解打包与拆包的概念、语法及应用场景,需要的朋友可以参考下
    2026-04-04
  • Python开发游戏之井字游戏的实战步骤

    Python开发游戏之井字游戏的实战步骤

    最近正在学习Python,所以最近做了一个关于Python的实例,下面这篇文章主要给大家介绍了关于Python开发游戏之井字游戏的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Python制作豆瓣图片的爬虫

    Python制作豆瓣图片的爬虫

    本文给大家分享的是作者制作的爬取豆瓣首页图片的爬虫代码,代码很简单,大家可以参考下思路,希望可以帮到大家
    2017-12-12
  • pycharm找不到解释器问题的解决方案

    pycharm找不到解释器问题的解决方案

    安装好PyCharm之后,新建或者导入项目碰到找不到解释器的情况,不用担心,追根到底,咱们就是需要找到pycharm*.exe的文件,那么这个文件在哪里呢?所以本文就给大家介绍一下pycharm找不到解释器问题的解决方案,需要的朋友可以参考下
    2024-04-04
  • 详解如何使用Pandas删除DataFrame中的非数字类型数据

    详解如何使用Pandas删除DataFrame中的非数字类型数据

    在数据处理和分析过程中,经常会遇到需要清洗数据的情况,本文将详细介绍如何使用Pandas删除DataFrame中的非数字类型数据,感兴趣的小伙伴可以了解下
    2024-03-03
  • Python脚本开发中的命令行参数及传参示例详解

    Python脚本开发中的命令行参数及传参示例详解

    这篇文章主要为大家介绍了Python脚本开发中的命令行参数及传参示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 使用Python轻松实现隐藏、显示和修改Excel网格线

    使用Python轻松实现隐藏、显示和修改Excel网格线

    在数据处理和报表制作中,Excel 是最常用的工具之一,而网格线(Gridlines)作为 Excel 默认的背景辅助线,本文将介绍如何使用 Spire.XLS for Python 库,通过简单的代码实现 Excel 网格线的隐藏/显示以及颜色修改快跟随小编一起学习一下吧
    2026-03-03
  • Python 标准库 fileinput与文件迭代器

    Python 标准库 fileinput与文件迭代器

    这篇文章主要介绍了Python标准库fileinput与文件迭代器,fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作,更多详细内容需要的朋友可以参考一下
    2022-09-09
  • python pandas多条件筛选实现方式

    python pandas多条件筛选实现方式

    用户在使用pandas进行多条件筛选时发现无现成方法,自行编写函数实现,数据为虚构,供参考学习,鼓励支持脚本之家
    2025-09-09

最新评论