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字符串处理之count()方法的使用
May 18 Python
python下10个简单实例代码
Nov 15 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Python requests库用法实例详解
Aug 14 Python
numpy基础教程之np.linalg
Feb 12 Python
python批量读取文件名并写入txt文件中
Sep 05 Python
python如何将多个PDF进行合并
Aug 13 Python
用Python调用win命令行提高工作效率的实例
Aug 14 Python
python打造爬虫代理池过程解析
Aug 15 Python
简单了解python协程的相关知识
Aug 31 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
python对Excel的读取的示例代码
Feb 14 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
php 地区分类排序算法
2013/07/01 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php命名空间学习详解
2014/02/27 PHP
thinkphp模板继承实例简述
2014/11/26 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
Safari5中alert的无限循环BUG
2011/04/07 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
动态加载JavaScript文件的两种方法
2016/04/22 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
python requests证书问题解决
2019/09/05 Python
使用Python实现批量ping操作方法
2020/05/06 Python
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
英国女士家居服网站:hush
2017/08/09 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
2013年军训通讯稿
2014/02/05 职场文书
工作评语大全
2014/04/26 职场文书
灰雀教学反思
2014/04/28 职场文书
房地产端午节活动方案
2014/08/24 职场文书
2015年安全生产目标责任书
2015/01/29 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
地心历险记观后感
2015/06/15 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
被委托人身份证明
2015/08/07 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python