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函数嵌套实例
Sep 23 Python
Django 跨域请求处理的示例代码
May 02 Python
Python实现简单石头剪刀布游戏
Jan 20 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Python文件时间操作步骤代码详解
Apr 13 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
python实现会员管理系统
Mar 18 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 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
Python下的subprocess模块的入门指引
2015/04/16 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
python实现flappy bird游戏
2018/12/24 Python
Flask框架踩坑之ajax跨域请求实现
2019/02/22 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
关于python字符串方法分类详解
2019/08/20 Python
使用Python爬虫库requests发送表单数据和JSON数据
2020/01/25 Python
Python使用qrcode二维码库生成二维码方法详解
2020/02/17 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
端口镜像是怎么实现的
2014/03/25 面试题
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
Mysql中常用的join连接方式
2022/05/11 MySQL