The*_*tor 8 php mysql password-hash mysql-error-1044
我正在尝试从位于slicehost(两个不同的托管公司)的服务器中的php脚本连接到dreamhost的mysql服务器.我需要这样做,所以我可以在slicehost将新数据传输到dreamhost.使用转储不是一个选项,因为表结构是不同的,我只需要传输一小部分数据(100-200每日记录)问题是我在slicehost使用新的MySQL密码哈希方法,而dreamhost使用旧的,所以我得到
$link = mysql_connect($mysqlHost, $mysqlUser, $mysqlPass, FALSE);
Warning: mysql_connect() [function.mysql-connect]: OK packet 6 bytes shorter than expected
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using old authentication
Warning: mysql_query() [function.mysql-query]: Access denied for user 'nodari'@'localhost' (using password: NO)
Run Code Online (Sandbox Code Playgroud)
事实:
对我来说更明显的选择是在dreamhost上开始使用新的MySQL密码哈希方法,但它们不会改变它,我不是root,所以我不能自己做.
任何疯狂的想法?
通过VolkerK消化:
mysql> SET SESSION old_passwords=0;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc'));
+------------------------+-------------------------+-------------------------+
| @@global.old_passwords | @@session.old_passwords | Length(PASSWORD('abc')) |
+------------------------+-------------------------+-------------------------+
| 1 | 0 | 41 |
+------------------------+-------------------------+-------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
现在显而易见的是运行mysql> SET GLOBAL old_passwords = 0; 但我需要SUPER特权这样做,他们不会给我
如果我运行查询
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');
Run Code Online (Sandbox Code Playgroud)
我收到了错误
ERROR 1044 (42000): Access denied for user 'nodari'@'67.205.0.0/255.255.192.0' to database 'mysql'
Run Code Online (Sandbox Code Playgroud)
我不是根...
dreamhost支持的人坚持说问题就在我的最后.但他说他会运行我告诉他的任何查询,因为它是私人服务器.所以,我需要告诉这个人确切地说要运行什么.所以,告诉他跑
SET SESSION old_passwords=0;
SET GLOBAL old_passwords=0;
SET PASSWORD FOR 'nodari'@'HOSTNAME' = PASSWORD('new password');
grant all privileges on *.* to nodari@HOSTNAME identified by 'new password';
Run Code Online (Sandbox Code Playgroud)
会是一个好的开始吗?
在某些情况下,您仍然可以设置和使用"新的哈希算法密码".
MySQL 4.1+服务器能够处理两种登录算法.使用哪一个独立于旧密码变量.如果MySQL找到以*开头的41个字符长的哈希值,则使用新系统.并且PASSWORD()函数也能够使用这两种算法.如果字段mysql.user.Password足够宽以存储41个字符而old-passwords变量为0则将创建"新"密码.该用于old_passwords机制的文档说Variable Scope Both,所以你也许可以改变你的会话.
连接到MySQL服务器(尽管全局old_passwords = 1,但客户端能够这样做),例如HeidiSQL并尝试以下操作:
SET SESSION old_passwords=0;
SELECT @@global.old_passwords,@@session.old_passwords, Length(PASSWORD('abc'));
Run Code Online (Sandbox Code Playgroud)
如果打印1, 0, 41(意味着全局old_passwords已打开,但对于会话已关闭且PASSWORD()返回"新"密码),您应该能够在同一会话中使用新算法为您的帐户设置新密码.
但是如果dreamhost真的想要禁用新密码算法,那么mysql.user.Password字段的长度将少于41个字符,你无能为力(除了唠叨它们).
是的,这看起来像个硬汉。如果没有主机的合作或无法更改密码格式或客户端库,您就没有很多选择。
老实说,我的第一选择是放弃 Dreamhost。这可能需要大量工作,但如果他们要继续使用旧的不兼容的东西,那么问题仍然会存在。
如果这不是一个选择,那么联合自动化流程怎么样?您可以将 Slicehost 端的数据导出到 CSV 文件中,并将其转换为 Dreamhost 所需的任何格式,然后将其上传到 Dreamhost 服务器。您可以在 Dreamhost 服务器上设置一个 cron 脚本,定期检查上传的文件并对其进行处理(确保在成功处理后将其移动或删除)。