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列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
python提取内容关键词的方法
Mar 16 Python
python遍历类中所有成员的方法
Mar 18 Python
Python的Flask框架中web表单的教程
Apr 20 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
Python多版本开发环境管理工具介绍
Jul 03 Python
python实现简易学生信息管理系统
Apr 05 Python
Python yield生成器和return对比代码实例
Apr 20 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python如何读取、写入JSON数据
Jul 28 Python
python抢购软件/插件/脚本附完整源码
Mar 04 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 文件上传源码分析(RFC1867)
2009/10/30 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
零基础php编程好学吗
2019/10/11 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
python读取几个G的csv文件方法
2019/01/07 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
PyQt5实现登录页面
2020/05/30 Python
健康监测猫砂:Pretty Litter
2017/05/25 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
介绍一下Java中标识符的命名规则
2014/02/03 面试题
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
电钳专业个人求职信
2014/01/04 职场文书
初中物理教学反思
2014/01/14 职场文书
自考生自我评价分享
2014/01/18 职场文书
无私奉献演讲稿
2014/09/04 职场文书
旷课检讨书范文
2014/10/30 职场文书
工作检讨书大全
2015/01/26 职场文书
店铺转让协议书
2015/01/29 职场文书
学术会议领导致辞
2015/07/29 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL