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实现全角半角转换的方法
Aug 18 Python
python清除指定目录内所有文件中script的方法
Jun 30 Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 Python
python多线程方式执行多个bat代码
Jun 07 Python
Python正则表达式使用范例分享
Dec 04 Python
python发送告警邮件脚本
Sep 17 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python已协程方式处理任务实现过程
Dec 27 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
Python绘图实现台风路径可视化代码实例
Oct 23 Python
Python Matplotlib库实现画局部图
Nov 17 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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 图片上传代码
2011/09/13 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
php制作简单模版引擎
2016/04/07 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
Vue 仿QQ左滑删除组件功能
2018/03/12 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
python运行其他程序的实现方法
2017/07/14 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
python 图片去噪的方法示例
2019/07/09 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
物业经理求职自我评价
2013/09/22 职场文书
会计岗位职责
2015/02/03 职场文书
2016年高校自主招生自荐信范文
2015/03/24 职场文书
格列夫游记读书笔记
2015/07/01 职场文书
感谢师恩主题班会
2015/08/17 职场文书
团干部培训班心得体会
2016/01/06 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL