如果服务器使用密钥登陆,连接 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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于