【问题标题】:Connection to remote mysql server through ssh using python mysqldb connector passwordless使用 python mysqldb 连接器无密码通过 ssh 连接到远程 mysql 服务器
【发布时间】:2021-07-08 14:36:26
【问题描述】:

Python 3.8

Mysql 8.0.23-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))

嗨,

我想使用 python 的 mysqldb 连接器和 paramiko 的 sshtunnelforwarder 连接到远程 mysql 服务器。

通过执行以下操作,我可以毫无问题地远程连接到数据库:

使用mysql密码认证连接数据库

server = new_ssh_server(config)
with server:
   print('Connection', server.local_bind_address)
   cnx = MySQLdb.connect(host = '127.0.0.1',
   port = server.local_bind_port,
   user = config['user'],
   passwd = config['password'],
   db = config['db'])

查询工作,我可以读/写数据库,没问题。

我想通过 ssh 使用 mysql auth_socket 身份验证方法,在不提供 mysql 密码的情况下连接到数据库。

可以通过以下代码恢复我的尝试:

使用mysql auth_socket认证连接数据库

with server as tunnel:
    print('Tunnel:', tunnel.local_bind_address)
    cnx = MySQLdb.connect(host = 'localhost', user = 'hillbilly', password = '', db='tutut')#, unix_socket="/tmp/mysql.sock")
    res = pd.read_sql('select * from users;', cnx)
    print(res)

这会引发以下错误:

File "connect_ssh_mysql_auth_socket.py", line 12, in <module>
    cnx = MySQLdb.connect(host = 'localhost', user = 'hillbilly', password = '', db='rsotest2')#, unix_socket="/tmp/mysql.sock")
  File "...../lib/python3.8/site-packages/MySQLdb/__init__.py", line 84, in Connect
    return Connection(*args, **kwargs)
  File "...../lib/python3.8/site-packages/MySQLdb/connections.py", line 179, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

我在远程服务器上拥有和现有的 mysqld.sock,我符号链接到 /tmp/mysql.sock,但错误仍然存​​在。我还在 /etc/mysql/mysql.conf.d/mysql.cnf 中添加了下一行:

socket=/run/mysqld/mysqld.sock

但我在尝试远程连接时仍然遇到同样的错误。

unix_socket='/run/mysqld/mysqld.sock' 指定到 mysqldb 连接器(在 Connecting to database using mysql auth_socket authentication 中注释)不能解决问题.

我好像对mysql.sock、mysqld.sock的使用有误解。 我无法找到也无法创建 mysql.sock 套接字。 我正在尝试做的事情可能吗?我记得在某处读到 unix 套接字只能在本地工作,这是否意味着它无法实现?

任何帮助/解释将不胜感激。

(编辑并关闭) 所以这是不可能的。在thread 之后,auth_socket 需要本地访问套接字文件(通常是 /tmp/mysql.sock)来运行身份验证测试,因此无法通过 ssh 隧道访问。

【问题讨论】:

    标签: python mysql ssh paramiko auth-socket


    【解决方案1】:

    无法通过 sshtunnel 使用 auth_socket 插件对远程 mysql 服务器进行身份验证,因为该插件需要本地访问套接字文件。请参阅此thread 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2015-07-31
      • 2022-07-11
      • 2019-09-15
      • 2016-11-18
      • 2011-04-16
      • 1970-01-01
      • 2012-11-26
      • 2020-09-30
      相关资源
      最近更新 更多