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网络编程学习笔记(一)
Jun 09 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
python 第三方库的安装及pip的使用详解
May 11 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
使用python3实现操作串口详解
Jan 01 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
python实现动态数组的示例代码
Jul 15 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
python可视化text()函数使用详解
Feb 11 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
如何真正的了解python装饰器
Aug 14 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
php过滤表单提交的html等危险代码
2014/11/03 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
php创建图像具体步骤
2017/03/13 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
字符串的replace方法应用浅析
2011/12/06 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
js写一个字符串转成驼峰的实例
2013/06/21 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
JS实现查找数组中对象的属性值是否存在示例
2019/05/24 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
jQuery实现文本显示一段时间后隐藏的方法分析
2019/06/20 jQuery
Vue实现附件上传功能
2020/05/28 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
python中threading超线程用法实例分析
2015/05/16 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
Django web框架使用url path name详解
2019/04/29 Python
python如何运行js语句
2020/09/09 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
商务考察邀请函范文
2014/01/21 职场文书
学校消防安全制度
2014/01/30 职场文书
财务会计自荐信范文
2014/02/21 职场文书
工程承包协议书
2014/04/22 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android