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 CSV模块使用实例
Apr 09 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
Sep 12 Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
python实现机器人行走效果
Jan 29 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
PyQt4实现下拉菜单可供选择并打印出来
Apr 20 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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
Protoss建筑一览
2020/03/14 星际争霸
PHP调用三种数据库的方法(3)
2006/10/09 PHP
php 高效率写法 推荐
2010/02/21 PHP
Symfony核心类概述
2016/03/17 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
DOM基础教程之使用DOM设置文本框
2015/01/20 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
js创建对象几种方式的优缺点对比
2016/09/28 Javascript
使用node.js实现微信小程序实时聊天功能
2018/08/13 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python partial函数原理及用法解析
2019/12/11 Python
python 求10个数的平均数实例
2019/12/16 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
美国一家主营日韩美妆护肤品的在线商店:iMomoko
2016/09/11 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
高中军训感言200字
2014/02/23 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang