Python基于ssh远程怎么连接Mysql数据库

背景

如果需要访问远程服务器的Mysql数据库,但是该Mysql数据库为了安全期间,安全措施设置为只允许本地连接(也就是你需要登录到该台服务器才能使用),其他远程连接是不可以直接访问,并且相应的端口也做了修改,那么就需要基于ssh来连接该数据库。连接数据库的方法类似于通过SSH在Navicat中实现界面化连接。

Navicat

Python基于ssh远程连接Mysql数据库,简单易学!

连接数据库

安装支持库
  • 如果要连接Mysql,首先需要安装pymysql

pip install pymysql
  • 安装基于ssh的库sshtunnel

pip install sshtunnel #当前最新 0.3.1版

建议安装最新的sshtunnel库,旧版本库有一些bug

连接Mysql

基于ssh连接Mysql可以查看sshtunnel的文档,里面有一些案例

with SSHTunnelForwarder(
('
192.168.1.1'
, 2222),
ssh_password='
123456'
,
ssh_username='
root'
,
remote_bind_address=('
127.0.0.1'
, 3306)) as server:
print('
SSH连接成功'
)
conn = pymysql.connect(host='
127.0.0.1'
,
port=server.local_bind_port,
user='
root'
,
database='
data'
,
charset='
utf8'
)
print('
mysql数据库连接成功'
)
cursor = conn.cursor()
... #获取数据操作,此处省略
cursor.close()
conn.close() 自定义查询函数

可以对上面的连接进行封装为一个函数,方便其他地方使用

def mysql_ssh(sql,args=None):
with SSHTunnelForwarder(
('
192.168.1.1'
, 2222),
ssh_password='
123456'
,
ssh_username='
root'
,
remote_bind_address=('
127.0.0.1'
, 3306)) as server:
print('
SSH连接成功'
)
conn = pymysql.connect(host='
127.0.0.1'
,
port=server.local_bind_port,
user='
root'
,
database='
data'
,
charset='
utf8'
)
print('
mysql数据库连接成功'
)
cursor = conn.cursor()
print('
游标获取成功'
)
try:
print(f'
执行查询语句:{sql} 参数:{args}'
)
cursor.execute(sql,args)
print('
数据查询成功'
)
conn.commit()
print('
事务提交成功'
)
datas = cursor.fetchall()
success = True
except:
print('
数据查询失败'
)
datas = None
success = False
print('
正在关闭数据库连接'
)
cursor.close()
conn.close()
return datas, success

注意点:

  • 在使用数据库时,conn.commit()、cursor.close()、conn.close()这些一定要规范使用,防止不必要的bug

  • 传入参数时建议用这种方式cursor.execute(sql,args),防止sql注入的风险



一、前言
Python作为一种脚本语言,有非常丰富的第三方库可以使用,其中就包括了连接数据库的库,如MySQLdb、SQLAlchemy、pymysql等,而基于ssh远程连接mysql数据库则是在Python中一个非常重要的应用场景。
二、什么是ssh
ssh(Secure Shell)是一种加密协议,主要用于远程登录和执行远程命令。我们可以通过ssh协议连接远程服务器,使用类似于本地终端的方式,在服务器上执行命令和程序等操作。
三、如何连接ssh
Python中连接ssh的库有paramiko、pexpect等,在这里我们介绍一种常用的库——paramiko。
调用paramiko库中的SSHClient类可以建立ssh连接:
```
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=’ssh-server.com’, port=’22’, username=’username’, password=’password’)
```
其中,ssh-server.com是远程ssh服务器的地址,22是远程ssh服务器的端口号,username和password则是连接到ssh服务器的用户名和密码。
四、如何连接Mysql
连接Mysql也是Python中非常重要的一个应用场景,为此,Python中专门有一个库叫做pymysql。
我们可以通过pymysql库中的connect函数连接到数据库:
```
import pymysql
conn = pymysql.connect(
\thost=’127.0.0.1’,
\tuser=’root’,
\tpassword=’xxxxx’,
\tdatabase=’test’,
\tport=3306,
\tcharset=’utf8’)
cur = conn.cursor()
```
其中,host是数据库服务器的地址,user和password则是连接到数据库的用户名和密码。database是连接的数据库名称,port则是数据库端口号,默认是3306。charset则是连接的编码格式,一般是‘utf8’。
五、如何在Python中使用ssh连接Mysql
将Paramiko和pymysql结合使用,就可以实现Python基于ssh远程连接Mysql数据库:
```
import paramiko
import pymysql
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=’ssh-server.com’, port=’22’, username=’username’, password=’password’)
ssh.invoke_shell()
channel = ssh.invoke_shell()
channel.sendall(‘mysql -uroot -pxxxxxx -Dtest\
’)
conn = pymysql.connect(
\thost=’127.0.0.1’,
\tuser=’root’,
\tpassword=’xxxxx’,
\tdatabase=’test’,
\tport=3306,
\tcharset=’utf8’)
cur = conn.cursor()
cur.execute(‘SELECT * FROM user_info’)
row = cur.fetchone()
while row:
\tprint(row)
\trow = cur.fetchone()
\tcur.close()
\tconn.close()
```
六、如何在Python中断开连接
在Python中断开Paramiko和pymysql连接,可以使用如下的代码:
```
ssh.close()
cur.close()
conn.close()
```
七、总结
Python基于ssh远程连接Mysql可以很方便地实现在远程服务器上对数据库进行操作的需求,在Python中连接Mysql不仅简单易学,还具有灵活性和实用性。借助于Paramiko和pymysql的优秀特性,在Python中实现基于ssh远程连接Mysql的过程可以变得简单、直观、高效。
通过以上的介绍,相信大家对Python基于ssh远程连接mysql数据库有了更深刻的了解,同时也为开发工作提供了更多的灵活性和便捷性。