有些时候,出于数据安全的考量,我们会对某些数据库的访问权限做一些限制,比如说我们可能会仅提供给某几台内网机器数据库访问权限,这时这几台机器就在我们数据库的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 ) Requirement already satisfied: sshtunnel in ./anaconda3/lib ) Requirement already satisfied: cryptography in ./anaconda3/lib (from pymysql) ) Requirement already satisfied: paramiko>=1.15.2 in ./anaconda3/lib (from sshtunnel) ) Requirement already satisfied: idna>=2.1 in ./anaconda3/lib (from cryptography->pymysql) ) Requirement already satisfied: asn1crypto>=0.21.0 in ./anaconda3/lib (from cryptography->pymysql) ) Requirement already satisfied: six>=1.4.1 in ./anaconda3/lib (from cryptography->pymysql) ) Requirement already satisfied: cffi>=1.7 in ./anaconda3/lib (from cryptography->pymysql) ) Requirement already satisfied: pyasn1>=0.1.7 in ./anaconda3/lib (from paramiko>=1.15.2->sshtunnel) ) Requirement already satisfied: pynacl>=1.0.1 in ./anaconda3/lib (from paramiko>=1.15.2->sshtunnel) ) Requirement already satisfied: bcrypt>=3.1.3 in ./anaconda3/lib (from paramiko>=1.15.2->sshtunnel) ) Requirement already satisfied: pycparser in ./anaconda3/lib (from cffi>=1.7->cryptography->pymysql) )由于我已经安装了这两个库,所以跟你看到的提示可能不太一样。
二、构建隧道连接对象
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': , 'db': 'Database名字' }这里需要注意的地方是,我们要将host和port部分调整为本地的监听端口。我们上述配置的server隧道对象有一个local_bind_port属性,它告诉我们它在本地的哪一个端口监听,所有发送到这一端口的请求都会被他自动通过隧道机器访问。
四、开始连接
# 连接数据库 connect = (**mysql_config) cursor = conn.cursor() # 查询并打印数据 cur('SELECT * FROM LIMIT 10') prin())好了,这样我们就成功实现了本地访问有IP限制的MySQL数据库,开始我们的数据探索吧。