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 相关文章推荐
Python3.0与2.X版本的区别实例分析
Aug 25 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
python中的RSA加密与解密实例解析
Nov 18 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
jupyter notebook 多行输出实例
Apr 09 Python
用python对oracle进行简单性能测试
Dec 05 Python
django使用多个数据库的方法实例
Mar 04 Python
如何正确理解python装饰器
Jun 15 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
杏林同学录(三)
2006/10/09 PHP
php中filter_input函数用法分析
2014/11/15 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript实现密码验证
2015/11/10 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
微信小程序实现下拉菜单切换效果
2020/03/30 Javascript
详解微信小程序回到顶部的两种方式
2019/05/09 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
关于python中密码加盐的学习体会小结
2019/07/15 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
美国知名生活购物网站:Goop
2017/11/03 全球购物
Spartoo荷兰:鞋子、包包和服装
2018/07/12 全球购物
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
学校清明节活动总结
2014/07/04 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
你真的会用Mysql的explain吗
2022/03/31 MySQL