python3 使用ssh隧道连接mysql的操作


Posted in Python onDecember 05, 2020

我就废话不多说了,大家还是直接看代码吧~

import pymysql
from sshtunnel import SSHTunnelForwarder
import pymysql.cursors #以dict形式输出

def dbconnect_ssh(ssh_host,ssh_port,keyfile,ssh_user,db_host,db_name,sql,db_port,db_user,db_passwd):
 with SSHTunnelForwarder(
   (ssh_host, ssh_port),
   #ssh_password="sshpasswd",
   ssh_pkey=keyfile,
   ssh_username=ssh_user,
   remote_bind_address=(db_host, db_port)
 ) as server:

  db = pymysql.connect(
   host='127.0.0.1',
   port=server.local_bind_port,
   user=db_user,
   passwd=db_passwd,
   db=db_name,
   charset="utf8",
   cursorclass=pymysql.cursors.DictCursor)

  cursor = db.cursor()

  try:
   cursor.execute(sql)
   data = cursor.fetchall()
   db.commit()
  except:
   db.rollback()

  collect = []
  for result in data:
   collect.append(result)

  db.close()
  cursor.close()

  return collect

if __name__ == "__main__":
 ssh_host = "10.10.2.13"   #SSH服务器地址
 ssh_port = 22     #SSH端口
 keyfile = xxxx.key" #SSH密钥
 ssh_user = "root"   #SSH用户名
 db_host = "127.0.0.1"  #数据库地址
 db_name = 'DBname'    #数据库名
 sql = 'show tables;'  #SQL
 db_port = 3306     #数据库端口
 db_user = 'root'    #数据库用户名
 db_passwd = '33333'   #数据库密码
 result = dbconnect_ssh(ssh_host,ssh_port,keyfile,ssh_user,db_host,db_name,sql,db_port,db_user,db_passwd)
 print (result)

补充知识:Python 使用SSHTunnel 连接内网mysql数据库

准备:

主要模块 sshtunnel, pip install sshtunnel

其余模块 pymysql,playhouse,configparser

简介:

这里用的是数据库连接池和自动的链接断开重连机制,其实最主要的就是sshtunner的建立,所以可以只看service建立的 部分

配置文件:

[mysql]
database=ad_insight
max_connections=10
stale_timeout=1000
host=localhost
user=数据库用户名
password=数据库密码
port=3306

python 代码

from playhouse.pool import PooledMySQLDatabase
from playhouse.shortcuts import ReconnectMixin
from configparser import ConfigParser
from sshtunnel import SSHTunnelForwarder
 
class RetryMySQLDatabase(ReconnectMixin,PooledMySQLDatabase):
 _instance = None
 
 @staticmethod
 def get_db_instance():
  if not RetryMySQLDatabase._instance:
   server = SSHTunnelForwarder(
    ssh_address_or_host='ssh域名或者地址',
    ssh_port=ssh端口,
    ssh_password='ssh密码',
    ssh_username='ssh名称',
    remote_bind_address=('数据库地址',数据库端口)
 
   )
   server.start()
   config = ConfigParser()
   config.read("./default.cfg",encoding="utf-8")
   RetryMySQLDatabase._instance = RetryMySQLDatabase(
    str(config['mysql']['database']),
    max_connections=int(config['mysql']['max_connections']),
    stale_timeout=int(config['mysql']['stale_timeout']),
    host=str(config['mysql']['host']),
    user=str(config['mysql']['user']),
    password=str(config['mysql']['password']),
    port=server.local_bind_port
    # port=int(config['mysql']['port'])
   )
  return RetryMySQLDatabase._instance

其实主要是在server对象的建立和server.start

希望能给大家一个参考,本人亲测有效。也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取当前计算机cpu数量的方法
Apr 18 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
Python爬取京东的商品分类与链接
Aug 26 Python
Python遍历numpy数组的实例
Apr 04 Python
20行python代码的入门级小游戏的详解
May 05 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python pandas模块基础学习详解
Jul 03 Python
python代码实现将列表中重复元素之间的内容全部滤除
May 22 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
python3.7调试的实例方法
Jul 21 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
Jun 01 Python
用Python生成会跳舞的美女
Jan 18 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 #Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 #Python
python subprocess pipe 实时输出日志的操作
Dec 05 #Python
python 操作excel表格的方法
Dec 05 #Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 #Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 #Python
快速解决pymongo操作mongodb的时区问题
Dec 05 #Python
You might like
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
大家须知简单的php性能优化注意点
2016/01/04 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
javascript的BOM汇总
2015/07/16 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
源码分析Vue.js的监听实现教程
2017/04/23 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
Python求算数平方根和约数的方法汇总
2016/03/09 Python
python中解析json格式文件的方法示例
2017/05/03 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
python try except 捕获所有异常的实例
2018/10/18 Python
postman传递当前时间戳实例详解
2019/09/14 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
面料业务员岗位职责
2013/12/26 职场文书
初婚未育未抱养证明
2014/01/12 职场文书
周年庆促销方案
2014/03/15 职场文书
工作保证书范文
2014/04/29 职场文书
保护水资源的标语
2014/06/17 职场文书
社区文艺活动方案
2014/08/19 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
Redis 限流器
2022/05/15 Redis
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL