Python通过SSHTunnel建立SSH隧道连接内网MySQL数据库
本文介绍如何利用Python的sshtunnel模块建立SSH隧道,从而安全连接内网MySQL数据库。通过配置sshtunnel和pymysql,实现通过SSH服务器中转访问远程数据库,支持连接池与自动重连机制,适用于需要安全访问内网数据库的场景。
Python通过SSHTunnel建立SSH隧道连接内网MySQL数据库
本文直接提供核心代码示例,便于读者快速上手。
基础SSH隧道连接实现
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。
功能简介:
本方案采用了数据库连接池以及自动断开重连机制,但核心关键在于sshtunnel的建立过程,因此读者可重点参考服务建立部分的代码。
配置文件示例如下:
数据库配置文件示例
[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()方法启动隧道。
以上内容经实际测试验证有效,希望能为大家提供参考,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









