AlwaysBeFriday 的博客

记录精彩的程序人生 开始使用

python 使用 ssh 隧道连接 mysql 服务器

如果服务器使用密钥登陆,连接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()

参数解释:

  1. ssh_address_or_host=('xxx.xxx.xxx.xxx', 22)
    该参数必须
    指定ssh登录的跳转机的ip和port,ssh端口默认为22,此处不做修改。当然如果要更加安全一些,可以修改一些程序服务的默认端口,避免被扫描侵入,然后被作为矿机。。。
  2. ssh_username="root"
    该参数必须
    ssh 连接目标服务器的用户
  3. ssh_password=password
    如果使用密码登录,该参数必须,如果使用密钥证书登录,该参数注释掉
    ssh 连接目标服务器的用户的密码
  4. ssh_pkey="C:\Users\XXXX\.ssh\证书"
    ssh 连接使用密钥证书登录,该参数必须
    该路径为目标服务器的公钥证书
  5. ssh_private_key_password=“”
    如果公钥证书有密码,该参数必须,如果没有密码,该参数注释掉
  6. remote_bind_address=('xxxxxx', 3306)
    通过目标服务器连接的 mysql 服务器,或者 redis 服务器的 ip 和 port
  7. local_bind_address=('127.0.0.1', 5141)
    该参数必须
    ssh 目标服务器的用于连接 mysql 或 redis 的端口
    该 ip 必须为 127.0.0.1
  8. 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

评论
留下你的脚步