暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库 | python通过ssh隧道连接mysql(sshtunnel模块)

潘潘潘平 2021-09-23
2558


目录

python通过ssh隧道连接mysql




详解

python通过ssh隧道连接mysql


为了保证数据库的安全,通常情况下不会允许直接连接数据库服务器,只允许堡垒机通过SSH访问,因此需要通过SSH隧道去连接服务器背后的数据库。


例如,MySQL数据库在服务器A上,只允许服务器B来访问,而本地机器C可以通过SSH连接服务器B,间接访问到服务器A上的MySQL。




python通过ssh隧道连接mysql需要用到的是sshtunnel模块。


sshtunnel是一个第三方模块,需要通过pip install sshtunnel进行安装。




用法:


    # 方法一
    import pymysql
    from sshtunnel import SSHTunnelForwarder


    server = SSHTunnelForwarder(ssh_address_or_host=('ssh目标服务器ip', 'ssh目标服务器端口号'),
                               ssh_username='ssh目标服务器用户名',
                               ssh_password='ssh目标服务器用户密码',
                               remote_bind_address=('mysql服务器ip', 'mysql服务器端口号'))


    server.start()  # 开启ssh服务




    # 连接mysql数据库
    conn = pymysql.connect(host='127.0.0.1',  # ip必须为127.0.0.1,代表本地机器
                          port=server.local_bind_port,  # ssh目标服务器用于连接mysql服务器的端口
                          user='mysql服务器用户名',
                          password='mysql服务器用户密码',
                          database='mysql服务器数据库',
                          charset='utf8')
    # 操作数据库




    server.close()  # 关闭ssh服务

    (左右滑动查看完整python代码)




      # 方法二:通过上下文管理器,可省去开启关闭服务的步骤
      import pymysql
      from sshtunnel import SSHTunnelForwarder


      with SSHTunnelForwarder(ssh_address_or_host=('ssh目标服务器ip', 'ssh目标服务器端口号'),
                             ssh_username='ssh目标服务器用户名',
                             ssh_password='ssh目标服务器用户密码',
                             remote_bind_address=('mysql服务器ip', 'mysql服务器端口号')
                             ) as server:
         
         # 连接mysql数据库
         conn = pymysql.connect(host='127.0.0.1',  # ip必须为127.0.0.1,代表本地机器
                                port=server.local_bind_port,  # ssh目标服务器用于连接mysql服务器的端口
                                user='mysql服务器用户名',
                                password='mysql服务器用户密码',
                                database='mysql服务器数据库',
                                charset='utf8')
         # 操作数据库

      (左右滑动查看完整python代码)





      完整写法:


        import pymysql
        from sshtunnel import SSHTunnelForwarder


        with SSHTunnelForwarder(ssh_address_or_host=('ssh目标服务器ip', 'ssh目标服务器端口号'),
                               ssh_username='ssh目标服务器用户名',
                               ssh_password='ssh目标服务器用户密码',
                               remote_bind_address=('mysql服务器ip', 'mysql服务器端口号')
                               ) as server:
           
           # 连接mysql数据库
           conn = pymysql.connect(host='127.0.0.1',  # ip必须为127.0.0.1,代表本地机器
                                  port=server.local_bind_port,  # ssh目标服务器用于连接mysql服务器的端口
                                  user='mysql服务器用户名',
                                  password='mysql服务器用户密码',
                                  database='mysql服务器数据库',
                                  charset='utf8')


           # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 查询返回字典,占用空间多
           cursor = conn.cursor()  # cursor游标,查询返回默认元组的值




           # 查
           # sql1 = "SELECT * FROM user WHERE id = %s"
           #
           # try:
           #     cursor.execute(sql1, (123,))
           #     data = cursor.fetchall()
           #     print(data)
           # except Exception as e:
           #     print(f"SQL执行失败:{e}")




           # 增删改
           sql2 = "DELETE FROM user WHERE id = %s"


           try:
               cursor.execute(sql2, (456,))
               conn.commit()  # 提交修改
           except Exception as e:
               print(f"SQL执行失败:{e}")
               conn.rollback()  # 如果发生错误则回滚


           cursor.close()  # 关闭游标
           conn.close()  # 关闭数据库的连接

        (左右滑动查看完整python代码)




        文章转载自潘潘潘平,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论