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笔记(叁)继续学习
Oct 24 Python
详解Python当中的字符串和编码
Apr 25 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
对Python 数组的切片操作详解
Jul 02 Python
如何更优雅地写python代码
Jul 02 Python
解决python3 安装不了PIL的问题
Aug 16 Python
python elasticsearch环境搭建详解
Sep 02 Python
pycharm运行scrapy过程图解
Nov 22 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
Dec 20 Python
Python爬虫基础初探selenium
May 31 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 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原创论坛
2006/10/09 PHP
PHP 高手之路(三)
2006/10/09 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
制作jquery遮罩层效果导航菜单代码分享
2013/12/25 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
使用layer模态框给新页面传值的方法
2019/09/27 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
js实现表格数据搜索
2020/08/09 Javascript
Pandas分组与排序的实现
2019/07/23 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
一套Delphi的笔试题二
2013/05/11 面试题
党建工作整改措施
2014/10/28 职场文书
教师工作决心书
2015/02/04 职场文书
浅谈Redis的事件驱动模型
2022/05/30 Redis