你可能有一个匿名用户
''@'localhost'
或
''@'127.0.0.1'
是的。
按照
the manual
:
当可能有多个匹配项时,服务器必须确定
使用它们。它解决这个问题如下:(…)
-
当客户机尝试连接时,服务器会查看行
[表mysql.user的]
按顺序排列。
-
服务器使用与客户端主机名和用户名匹配的第一行。
(…)
服务器使用排序规则对行进行排序
首先是最具体的主机值
是的。
文字主机名
[例如“localhost”]
IP地址是最具体的。
因此,这样的匿名用户将“屏蔽”任何其他用户
'[any_username]'@'%'
从连接时
localhost
是的。
'bill'@'localhost'
不匹配
'bill'@'%'
,但会匹配(例如)
'@'本地主机'
在动手之前。
建议的解决方案是删除这个匿名用户(这通常是一件好事)。
下面的编辑大多与主要问题无关。这些只是为了回答本主题中其他评论中提出的一些问题。
编辑1
身份验证
“帐单”@“%”
通过插座。
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
Welcome to the MySQL monitor (...)
mysql> SELECT user, host FROM mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| bill | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | bill@% |
+----------------+----------------+
1 row in set (0.02 sec)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | ON |
+-----------------+-------+
1 row in set (0.00 sec)
编辑2
完全相同的设置,除了我重新激活了网络,现在我创建了一个匿名用户
'@'本地主机'
是的。
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Welcome to the MySQL monitor (...)
mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
Query OK, 0 rows affected (0.00 sec)
mysql> Bye
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket=/tmp/mysql-5.5.sock
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
编辑3
与编辑2中的情况相同,现在提供匿名用户的密码。
root@myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Welcome to the MySQL monitor (...)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| bill@localhost | @localhost |
+----------------+----------------+
1 row in set (0.01 sec)
结论1,编辑1:一个人可以认证为
“帐单”@“%”
通过插座。
结论2,来自编辑2:一个人是通过TCP连接还是通过套接字连接对身份验证过程没有影响(除了一个人不能像其他人一样连接,但是
'something'@'localhost'
显然是通过插座)。
结论3,来自编辑3:尽管我指定
-ubill
,我已被授予作为匿名用户的访问权限。这是因为上面建议的“排序规则”。注意,在大多数默认安装中,
a no-password, anonymous user exists
(并应固定/移除)。