当前位置: 首页 > news >正文

《python》paramiko+paramiko实现远程通过ssh通道连接数据库

阿丹:

        在一些特定的场景下面,需要使用线上的数据库。但是正常使用连接肯定是连接不上的,所以这里就需要使用ssh通道来连接线上的数据库。

pip install paramiko pymysql

下面是示例代码:

import paramiko
import pymysql# SSH隧道配置
ssh_host = 'your_ssh_server_ip'
ssh_port = 22
ssh_user = 'your_ssh_username'
ssh_password = 'your_ssh_password'# MySQL数据库配置
mysql_host = 'your_mysql_host_or_ip'  # 这里填写MySQL的实际地址,如果通过SSH隧道访问localhost即可
mysql_port = 3306
mysql_user = 'your_mysql_username'
mysql_password = 'your_mysql_password'
mysql_db = 'your_database_name'def create_ssh_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, remote_bind_address, local_bind_port):"""创建SSH隧道"""transport = paramiko.Transport((ssh_host, ssh_port))transport.connect(username=ssh_user, password=ssh_password)# 设置转发规则,将本地端口转发到远程MySQL服务器channel = transport.open_channel("direct-tcpip", (remote_bind_address, mysql_port), ('', local_bind_port))return channeldef query_mysql_via_tunnel(mysql_user, mysql_password, mysql_db, local_bind_port):"""通过SSH隧道连接MySQL并执行查询"""conn = pymysql.connect(host='127.0.0.1', port=local_bind_port, user=mysql_user, passwd=mysql_password, db=mysql_db)try:with conn.cursor() as cursor:cursor.execute('SELECT VERSION()')result = cursor.fetchone()print("MySQL version:", result)finally:conn.close()if __name__ == "__main__":# 创建SSH隧道local_bind_port = 3307  # 选择一个未被占用的本地端口tunnel = create_ssh_tunnel(ssh_host, ssh_port, ssh_user, ssh_password, (mysql_host, mysql_port), local_bind_port)try:# 通过隧道连接MySQL并执行查询query_mysql_via_tunnel(mysql_user, mysql_password, mysql_db, local_bind_port)finally:# 关闭SSH连接tunnel.close()

请注意,需要将上述代码中的your_ssh_server_ipyour_ssh_usernameyour_ssh_passwordyour_mysql_host_or_ipyour_mysql_usernameyour_mysql_password以及your_database_name替换为实际的值。此外,确保你有权限通过SSH访问目标服务器,并且MySQL服务器允许来自SSH服务器的连接。

相关文章:

  • Spring MVC学习记录(基础)
  • leaflet,canvas渲染目标,可加载大批量数据
  • 配电室数据中心巡检3d可视化搭建的详细步骤
  • OCC介绍及框架分析
  • 在vue和uniapp中使用 websocket并封装js
  • Android GLES渲染——渲染回读
  • MFC序列号输入框
  • 一套轻量、安全的问卷系统基座,提供面向个人和企业的一站式产品级解决方案
  • K-Means 算法详解
  • 游戏中的寻路算法研究
  • 解决内核模块加载使用-f参数无法加载的问题
  • 为什么要学Java?
  • Linux驱动开发(二)--字符设备驱动开发提升 LED驱动开发实验
  • 18个机器学习核心算法模型总结
  • 2025计算机毕业设计选题题目推荐-毕设题目汇总大全
  • Docker 笔记(2):Dockerfile
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript新鲜事·第5期
  • mongodb--安装和初步使用教程
  • Objective-C 中关联引用的概念
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php中curl和soap方式请求服务超时问题
  • Spring声明式事务管理之一:五大属性分析
  • 从零搭建Koa2 Server
  • 服务器从安装到部署全过程(二)
  • 精彩代码 vue.js
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 马上搞懂 GeoJSON
  • 提醒我喝水chrome插件开发指南
  • 我从编程教室毕业
  • 追踪解析 FutureTask 源码
  • 《码出高效》学习笔记与书中错误记录
  • AI算硅基生命吗,为什么?
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • "无招胜有招"nbsp;史上最全的互…
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (~_~)
  • (55)MOS管专题--->(10)MOS管的封装
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (四) Graphivz 颜色选择
  • (转)http-server应用
  • (转)JAVA中的堆栈
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net mvc 获取url中controller和action
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 使用反射注册事件
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .NET的数据绑定
  • .NET值类型变量“活”在哪?