Python使用sshtunnel代理MySql - Go语言中文社区

Python使用sshtunnel代理MySql


sshtunnel: https://pypi.python.org/pypi/sshtunnel


SSHTunnelForwarder 与代理机器创建一个连接与远程的服务代理

遇到的问题:代理成功了,但是脚本运行失败了,脚本可能在后台运行,再次运行的时候,失败了,因为一个端口只能被绑定一次

已遇到过的异常如下:

     异常1: pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

     异常2:msg = 'Problem setting SSH Forwarder up: {0}'.format(e.args[0])
                  IndexError: tuple index out of range   遇到这个异常应该是已经有正在运行程序使用这个端口

#encoding=utf-8

import time
import threading
import pymysql
from sshtunnel import SSHTunnelForwarder,create_logger

sshIp='xxxxxx'
sshPort=22
sshUser='xxxx'
sshPassword='xxx'


class DbVo(object):

    def __init__(self,
                 host=None,
                 port=None,
                 user=None,
                 password=None,
                 dbName=None,
                 charset='utf-8',
                 localPort=10000
                 ):
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.dbName = dbName
        self.charset = charset
        self.localPort = localPort


def connect(proxyInfo):
    server = SSHTunnelForwarder(
        ssh_address_or_host=(sshIp,sshPort),
        ssh_username=sshUser,
        ssh_password=sshPassword,
        local_bind_address=('127.0.0.1',proxyInfo.loaclPort),#绑定的端口
        remote_bind_address=(proxyInfo.host,proxyInfo.port)#代理远程的端口
        logger=create_logger(loglevel=1)  #sshtunnel打开日志输出
    )
    server.start()

#代理锁死主线程,所有使用一个线程去运行代理
def proxyConnect(proxyInfo):
    thread = threading.Thread(target=connect,args=(proxyInfo,))
    thread.start()


def connectDataBase(dbinfo):
    proxyConnect(dbinfo)
    time.sleep(2)
    client = pymysql.connect(
        host='127.0.0.1',  # 此处必须是是127.0.0.1
        port=dbinfo.localPort,
        user=dbinfo.user,
        passwd=dbinfo.password,
        db=dbinfo.dbName,
        charset='utf8')
    return client



def getCount(dbClient,tableName):
    sql = "select count(*) from t_table"
    print sql
    cursor = dbClient.cursor()
    cursor.execute(sql)
    values = cursor.fetchall()
    cursor.close()
    print values[0][0]

dataCenter = DbVo(
    host="host",
    port=3306,
    user="db_name",
    password="password",
    dbName="db_name",
    localPort=8203
    )

dataCenterDbClient = connectDataBase(dataCenter)
getCount(dataCenterDbClient) 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zengrenyuan/article/details/77053867
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 01:46:11
  • 阅读 ( 940 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢