如果服务器使用密钥登陆,连接 mysql 数据库时,就必须使用 ssh 连接,然后再进行数据库连接操作。可以使用 python 的 sshtunnel 库,进行 ssh 连接,连接成功后再进行数据库连接。
首先连接是 redis
from sshtunnel import SSHTunnelForwarder with SSHTunnelForwarder( ssh_address_or_host=('xxx.xxx.xxx.xxx', 22), # ssh 目标服务器 ip 和 port ssh_username="root", # ssh 目标服务器用户名 # ssh_password=password # ssh 目标服务器用户密码 ssh_pkey="C:\\Users\\XXX\\.ssh\\证书", # ssh 目标服务器证书 # ssh_private_key_password=“” # ssh 目标服务器证书密码 remote_bind_address=('127.0.0.1', 6379), # redis 服务 ip 和 port,'127.0.0.1' 即连接 ssh 目标服务器上的 redis 服务 local_bind_address=('127.0.0.1', 5144), # ssh 目标服务器的用于连接 mysql 或 redis 的端口,该 ip 必须为 127.0.0.1 ) as server: conn = redis.StrictRedis( host=server.local_bind_host, port=server.local_bind_port, password=password, db=db, decode_responses=True ) return func(*args, conn=conn)
然后连接是 mysql
from sshtunnel import SSHTunnelForwarder with SSHTunnelForwarder( ssh_address_or_host=('xxx.xxx.xxx.xxx', 22), # ssh 目标服务器 ip 和 port ssh_username="root", # ssh 目标服务器用户名 # ssh_password=password # ssh 目标服务器用户密码 ssh_pkey="C:\\Users\\XXX\\.ssh\\证书", # ssh 目标服务器证书 # ssh_private_key_password=“” # ssh 目标服务器证书密码 remote_bind_address=('xxxxxxxx', 3306), # mysql 服务 ip 和 port local_bind_address=('127.0.0.1', 5143), # ssh 目标服务器的用于连接 mysql 或 redis 的端口,该 ip 必须为 127.0.0.1 ) as server: conn = pymysql.connect( host=server.local_bind_host, # server.local_bind_host 是 参数 local_bind_address 的 ip port=server.local_bind_port, # server.local_bind_host 是 参数 local_bind_address 的 port user="root", password=password, db=db, charset="utf8" ) cursor = conn.cursor()
参数解释:
- ssh_address_or_host=('xxx.xxx.xxx.xxx', 22)
该参数必须
指定 ssh 登录的跳转机的 ip 和 port,ssh 端口默认为 22,此处不做修改。当然如果要更加安全一些,可以修改一些程序服务的默认端口,避免被扫描侵入,然后被作为矿机。。。 - ssh_username="root"
该参数必须
ssh 连接目标服务器的用户 - ssh_password=password
如果使用密码登录,该参数必须,如果使用密钥证书登录,该参数注释掉
ssh 连接目标服务器的用户的密码 - ssh_pkey="C:\Users\XXXX\.ssh\证书"
ssh 连接使用密钥证书登录,该参数必须
该路径为目标服务器的公钥证书 - ssh_private_key_password=“”
如果公钥证书有密码,该参数必须,如果没有密码,该参数注释掉 - remote_bind_address=('xxxxxx', 3306)
通过目标服务器连接的 mysql 服务器,或者 redis 服务器的 ip 和 port - local_bind_address=('127.0.0.1', 5141)
该参数必须
ssh 目标服务器的用于连接 mysql 或 redis 的端口
该 ip 必须为 127.0.0.1 - pymysql.connect(host=server.local_bind_host, port=server.local_bind_host)
通过 server 的 host 和 port 连接
当让也可以不通过 with 使用 SSHTunnelForwarder 连接 ssh:
server = SSHTunnelForwarder(xxxxxx)# 连接 server2.start() # 手动启动server server2.stop() # 手动关闭server
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于