緣起:
公司很多的數據庫的鏈接都是本地連接或者指定ip地址可以訪問, 如果你沒有該ip權限, 但是你可以登錄該數據庫所在的服務器, 這個時候就可以使用ssh鏈接上這個服務器,以此為跳板進行數據庫的鏈接.同樣Navicat也是支持這種操作的.但是開發中也要這種處理方式就需要sshtunnel包的輔助
github: https://github.com/pahaz/sshtunnel
安裝:
pip install sshtunnel
使用:
import pymysql import traceback from loguru import logger from sshtunnel import SSHTunnelForwarder
ssh_config=
{
'ssh': ('x.x.x.x', 22),
'username': 'x',
'password': 'x',
},
'mysql_config': {
'mysql': ('xx.xx.xx.xx', 3306),
'user': 'xx',
'passwd': 'xx',
}
}
with SSHTunnelForwarder( ssh_address_or_host=ssh_config['ssh'], # 遠程登錄服務器的ip和端口(元組表示) ssh_username=ssh_config['username'], # 登錄用戶名 ssh_password=ssh_config['password'], # 登錄密碼 remote_bind_address=mysql_config['mysql'] # mysql的ip+端口 ) as server: conn_config = dict( host='127.0.0.1', # 一般是固定 port=server.local_bind_port, # 端口保持一致 user=mysql_config['user'], # mysql的用戶名 passwd=mysql_config['passwd'], # mysql的密碼 ) try: conn = pymysql.connect(**conn_config) with conn.cursor(pymysql.cursors.DictCursor) as cursor: sql = 'SELECT VERSION()' cursor.execute(sql) res = cursor.fetchone() logger.info('Connect Success. result: {}'.format(res)) except Exception: logger.error('Connect Error. msg: {}'.format(traceback.format_exc()))