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正则分析nginx的访问日志
Jan 17 Python
Python 常用的安装Module方式汇总
May 06 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
微信跳一跳游戏python脚本
Apr 01 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python matplotlib学习笔记之坐标轴范围
Jun 28 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
Django 框架模型操作入门教程
Nov 05 Python
基于Python实现简单学生管理系统
Jul 24 Python
手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤
Aug 07 Python
Python进行统计建模
Aug 10 Python
Python之字典对象的几种创建方法
Sep 30 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
php 如何获取数组第一个值
2013/08/06 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
js读取csv文件并使用json显示出来
2015/01/09 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
jquery.form.js框架实现文件上传功能案例解析(springmvc)
2016/05/26 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
不可错过的十本Python好书
2017/07/06 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
python cookie反爬处理的实现
2020/11/01 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
普通院校学生的自荐信
2013/11/27 职场文书
工厂保洁员岗位职责
2013/12/04 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript