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)