J'utilise le compte root créé le compte 'a'@'%'
. Mais je ne peux pas utiliser le compte pour me connecter au serveur MySQL lorsque je spécifie le paramètre hôte. Je peux me connecter avec succès sans le -h
paramètre. Veuillez consulter la transcription ci-dessous. J'espère que quelqu'un pourra m'aider à l'expliquer. Merci.
mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for a@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> exit
Bye
[root@localhost ~]# mysql -h localhost -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1
Connection id: 20
Current database:
Current user: a@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 15 days 15 hours 20 min 18 sec
Threads: 1 Questions: 40 Slow queries: 0 Opens: 41 Flush tables: 1 Open tables: 4 Queries per second avg: 0.000
--------------
mysql>
Modifier:
Oui, MySQL écoute sur le port 3306.
[root@localhost ~]# nmap localhost
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
840/tcp open unknown
3306/tcp open mysql
Nmap finished: 1 IP address (1 host up) scanned in 0.064 seconds
[root@localhost ~]#
mysql
authentication
Juste un apprenant
la source
la source
'a'@'%'
. donc, le premier record a été'a'@'%'
, et le second est'a'@'localhost'
.Réponses:
Voici une méthode simple et rapide pour vérifier comment MySQL effectue une authentification réussie.
Veuillez exécuter cette requête:
USER () indique comment vous avez tenté de vous authentifier dans mysqld
CURRENT_USER () indique comment vous avez été autorisé à vous authentifier par mysqld
Parfois,
USER()
etCURRENT_USER()
sont différents. C'est parce que l'authentification mysql suit un protocole spécifique.Selon le guide d'étude de certification MySQL 5.0
les pages 486,487 indiquent ce qui suit sur l'algorithme d'authentification de mysql:
À partir de cette description, vous n'avez pas à vous soucier de l'ordre des tables mysql.user car il existe une copie en mémoire des tables d'octroi qui est triée comme mentionné précédemment.
En ce qui concerne la façon dont vous vous êtes connecté, cela n'a
mysql -u a
fonctionné. Revenez en arrière et connectez-vous à nouveau et exécutez ces commandesSois sûr que
C'est juste une supposition, mais je soupçonne
mysql -u a
de me connecter via localhost car lorsque le protocole de connexion n'est pas spécifié, la valeur par défaut est de se connecter via le fichier socket. Il peut exister une entrée dansmysql.user
laquelle autoriser la connexion localhost anonyme.Exécutez cette requête:
Si vous récupérez une ligne sans mot de passe, cela explique pleinement pourquoi cela
mysq -u a
fonctionne.MISE À JOUR 2012-01-19 11:12 EDT
Craig Efrein a soulevé une question intéressante: si deux noms d'utilisateur identiques existent dans la table mysql.user, l'un avec un mot de passe et l'autre sans, cela signifie-t-il que MySQL refuse l'authentification lorsqu'il n'utilise pas de mot de passe?
Cette question est une excellente information sur l'authentification des utilisateurs MySQL.
Veuillez noter que la clé primaire de mysql.user est hôte, utilisateur. Il n'y a pas d'autres index. Cela permet plusieurs occurrences d'un nom d'utilisateur. Chaque occurrence peut avoir un mot de passe différent ou aucun mot de passe. Cela permet à l'utilisateur «dbuser» de se connecter localement (dbuser @ localhost) sans mot de passe et avec la même connexion utilisateur depuis un autre serveur au sein d'un netblock donné (dbuser@'10.1.2.20 ») avec un mot de passe comme« pass1 »et cet utilisateur de se connecter à distance depuis n'importe où (dbuser @ '%') avec un mot de passe distant comme 'pass2'.
Compte tenu de l'algorithme d'authentification utilisé par MySQL, aucune restriction n'est imposée aux utilisateurs avec la présence ou l'absence d'un mot de passe.
C'est pourquoi le Guide d'étude de certification MySQL 5.0 dit à la page 498 Le paragraphe 6 de ses puces explique comment nettoyer le processus d'authentification:
la source
Le caractère générique de l'hôte '%' ne correspond pas à 'localhost'. Par défaut, le client mysql essaiera de se connecter via une socket plutôt que tcp (généralement un endroit comme /var/lib/mysql/mysql.sock).
Vous pouvez soit changer votre allocation en 'a' @ 'localhost', soit forcer le client à opérer sur la pile TCP comme:
la source
my.cnf
pour ne plus avoir besoin de ce paramètre?Avez-vous vérifié que MySQL écoute réellement sur 3306? Exécutez un netstat -tlpn et fournissez les résultats. Si vous ne voyez pas 3306, ce n'est probablement pas le cas.
Dans my.cnf, vous devez vérifier que --skip-networking est mis en commentaire
la source
Comme @atxdba l'a décrit, pour connecter le démon mysql à distance qui ne se connecte pas via socket, vous devez donc vous connecter à distance via TCP.
Pour cela, vous devez spécifier le
--protocol=TCP
pour chaque connexion. Cependant, vous pouvez le configurermy.cnf
sur le serveur:la source