【发布时间】: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