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)