Python3隧道连接MySQL数据库

版权声明:原创文章,未经允许不得转载。www.data-insights.cn. https://blog.csdn.net/qixizhuang/article/details/83147221


有些时候,出于数据安全的考量,我们会对某些数据库的访问权限做一些限制,比如说我们可能会仅提供给某几台内网机器数据库访问权限,这时这几台机器就在我们数据库的IP白名单中,这些IP之外的机器均无法访问我们的数据库。

数据安全得到了保障,但是我们进行一些本地开发的时候可能会不太方便。尤其是出于稳定性考虑,服务器的软件版本往往较为落后,且软件丰富程度、可定制程度都无法跟本地相提并论。在数据探索阶段,我们往往更倾向于使用本地更新、更强大、更丰富的软件包来完成任务。

我们今天的目标就是在本地通过隧道的方式登录有IP限制的MySQL数据库。

这种方法的原理很简单,就是我们需要一台在IP白名单中的机器的登录用户名及密码,这样我们就可以伪装成这一台机器来访问数据库的数据,并将数据取回本地进行使用。

接下来开始我们的尝试。

一、安装依赖

我们需要用到pymysql和sshtunnel两个库来实现隧道连接MySQL数据库。pymysql用于实现MySQL数据库操作,sshtunnel则用于构建隧道对象。当然,也存在其他替代的库,大家可以自行搜索安装,我们今天所有的演示均使用这两个库。

# dain @ DAINdeMacBook-Pro in ~ [14:59:30]
$ pip install pymysql sshtunnel
Requirement already satisfied: pymysql in ./anaconda3/lib/python3.6/site-packages (0.9.2)
Requirement already satisfied: sshtunnel in ./anaconda3/lib/python3.6/site-packages (0.1.4)
Requirement already satisfied: cryptography in ./anaconda3/lib/python3.6/site-packages (from pymysql) (2.2.1)
Requirement already satisfied: paramiko>=1.15.2 in ./anaconda3/lib/python3.6/site-packages (from sshtunnel) (2.4.2)
Requirement already satisfied: idna>=2.1 in ./anaconda3/lib/python3.6/site-packages (from cryptography->pymysql) (2.7)
Requirement already satisfied: asn1crypto>=0.21.0 in ./anaconda3/lib/python3.6/site-packages (from cryptography->pymysql) (0.24.0)
Requirement already satisfied: six>=1.4.1 in ./anaconda3/lib/python3.6/site-packages (from cryptography->pymysql) (1.11.0)
Requirement already satisfied: cffi>=1.7 in ./anaconda3/lib/python3.6/site-packages (from cryptography->pymysql) (1.11.5)
Requirement already satisfied: pyasn1>=0.1.7 in ./anaconda3/lib/python3.6/site-packages (from paramiko>=1.15.2->sshtunnel) (0.4.4)
Requirement already satisfied: pynacl>=1.0.1 in ./anaconda3/lib/python3.6/site-packages (from paramiko>=1.15.2->sshtunnel) (1.3.0)
Requirement already satisfied: bcrypt>=3.1.3 in ./anaconda3/lib/python3.6/site-packages (from paramiko>=1.15.2->sshtunnel) (3.1.4)
Requirement already satisfied: pycparser in ./anaconda3/lib/python3.6/site-packages (from cffi>=1.7->cryptography->pymysql) (2.18)

由于我已经安装了这两个库,所以跟你看到的提示可能不太一样。

二、构建隧道连接对象

server = SSHTunnelForwarder(
    ssh_address_or_host = ('隧道机器IP', 22),
    ssh_username = '隧道机器用户名',
    ssh_password = '隧道机器密码',
    remote_bind_address = ('数据库地址', 3306)
)

三、配置数据库登录信息

mysql_config = {
    'user': '数据库用户名',
    'passwd': '数据库密码',
    'host': '127.0.0.1', 
    'port': server.local_bind_port,
    'db': 'Database名字'
}

这里需要注意的地方是,我们要将host和port部分调整为本地的监听端口。我们上述配置的server隧道对象有一个local_bind_port属性,它告诉我们它在本地的哪一个端口监听,所有发送到这一端口的请求都会被他自动通过隧道机器访问。

四、开始连接

# 启动隧道服务
server.start()

# 连接数据库
connect = pymysql.connect(**mysql_config)
cursor = conn.cursor()

# 查询并打印数据
cursor.execute('SELECT * FROM testdb.testtable LIMIT 10')
print(cursor.fetchall())

好了,这样我们就成功实现了本地访问有IP限制的MySQL数据库,开始我们的数据探索吧。

猜你喜欢

转载自blog.csdn.net/qixizhuang/article/details/83147221