我正在尝试运行用Python 2.7.5编写的脚本(不使用Django)。当它尝试使用MySQLdb.connect()方法连接到远程mysql服务器时,它会抛出以下错误:
_mysql_exceptions.OperationalError: (2049, "Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)")
我已经读完了这个问题:
有没有办法在MySQLdb.connect()方法中设置一个参数来将secure_auth
设置为false?无需更改任何密码或从cmd行运行命令。我查看了official docs,但似乎没有任何内容。
我尝试将secure_auth=False
添加到参数中但会引发错误(如下面的代码所示)。
的Python:
def get_cursor():
global _cursor
if _cursor is None:
try:
db = MySQLdb.connect(user=_usr, passwd=_pw, host='external.website.com', port=3306, db=_usr, charset="utf8")
# tried this but it doesnt work (as expect but tried anyway) which throws this error
# TypeError: 'secure_auth' is an invalid keyword argument for this function
# db = MySQLdb.connect(user=_usr, passwd=_pw, host='external.website.com', port=3306, db=_usr, charset="utf8", secure_auth=false)
_cursor = db.cursor()
except MySQLdb.OperationalError:
print "error connecting"
raise
return _cursor
答案 0 :(得分:3)
我花费了大量时间来处理MySQLdb源代码,并确定如果不修补MySQLdb的C包装代码就无法完成。从理论上讲,您应该能够传递SECURE_CONNECTION标志以指定不想使用不安全的旧密码:
MySQLdb.connect(..., client_flags=MySQLdb.constant.CLIENT.SECURE_CONNECTION)
但MySQLdb代码实际上从未检查过该标志,并且在调用MySQL连接代码时从不配置secure_connection选项,因此它总是默认需要新式密码。
可能的修复包括:
抱歉,我没有更好的答案。我自己就遇到了这个问题!
答案 1 :(得分:1)
我知道摩西的答案已经过验证,但我想根据他的建议提供我的工作。
我以前为我的python安装了mysql_python,并安装了mysql的brew版本。
我发现了所有这些。
我通过查找源代码的最后一个稳定版本来寻找安装MySQLdb的方法。
我编译了它们(遵循isntructions here),安装它们然后我找了一个稳定版本的MySQL客户端(MySQL网站是最好的地方)并安装完全适合我的5.5版本要求。
我让mysql自动启动然后重新启动我的计算机(但你可以重新启动apache)并检查所有路径是否正确并且右边包含在正确的位置(你可以检查上面的链接)。
现在一切正常!
希望它有所帮助。
答案 2 :(得分:0)
SSL是一个单独的参数,您可以在连接参数中设置...以下是源代码中的注释...尝试检查mysql_ssl_set()文档。
ssl
dictionary or mapping, contains SSL connection parameters;
see the MySQL documentation for more details
(mysql_ssl_set()). If this is set, and the client does not
support SSL, NotSupportedError will be raised.
本文档讨论了所有安全参数 - http://dev.mysql.com/doc/refman/5.0/en/mysql-ssl-set.html ...
我没有看到任何禁用安全身份验证的内容......