Ich benutze das Root-Konto erstellt das Konto 'a'@'%'
. Ich kann das Konto jedoch nicht verwenden, um eine Verbindung zum MySQL-Server herzustellen, wenn ich den Host-Parameter angebe. Ich kann erfolgreich ohne den -h
Parameter verbinden. Bitte beachten Sie das Transkript unten. Ich hoffe, jemand kann mir helfen, es zu erklären. Vielen Dank.
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>
Bearbeiten:
Ja, MySQL lauscht auf 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
Nur ein Anfänger
quelle
quelle
'a'@'%'
. Der erste Datensatz war also'a'@'%'
und der zweite ist'a'@'localhost'
.Antworten:
Hier ist eine einfache Methode, um herauszufinden, wie MySQL eine erfolgreiche Authentifizierung durchführt.
Bitte führen Sie diese Abfrage aus:
USER () gibt an , wie Sie versucht haben, sich in mysqld zu authentifizieren
CURRENT_USER () gibt an , wie Sie sich von mysqld authentifizieren durften
Manchmal
USER()
undCURRENT_USER()
sind anders. Das liegt daran, dass die MySQL-Authentifizierung einem bestimmten Protokoll folgt.Laut MySQL 5.0-Leitfaden für Zertifizierungsstudien
Auf den Seiten 486.487 wird Folgendes zum MySQL-Authentifizierungsalgorithmus angegeben:
In dieser Beschreibung müssen Sie sich keine Gedanken über die Reihenfolge der mysql.user-Tabellen machen, da eine speicherinterne Kopie der Grant-Tabellen vorhanden ist, die wie oben beschrieben sortiert ist.
In Bezug auf, wie Sie sich angemeldet haben, hat nur
mysql -u a
funktioniert. Gehen Sie zurück und melden Sie sich erneut an und führen Sie diese Befehle ausStelle sicher das
Dies ist nur eine Vermutung, aber ich vermute, eine
mysql -u a
Verbindung über localhost herzustellen, da bei nicht angegebenem Verbindungsprotokoll standardmäßig eine Verbindung über die Socket-Datei hergestellt wird. Möglicherweise ist ein Eintrag vorhandenmysql.user
, der eine anonyme localhost-Verbindung zulässt.Führen Sie diese Abfrage aus:
Wenn Sie eine Zeile ohne Kennwort zurückerhalten, wird vollständig erklärt, warum dies
mysq -u a
funktioniert.UPDATE 2012-01-19 11:12 EDT
Craig Efrein hat eine interessante Frage aufgeworfen: Wenn zwei identische Benutzernamen in der Tabelle mysql.user existieren, einer mit und einer ohne Kennwort, bedeutet dies, dass MySQL die Authentifizierung verweigert, wenn kein Kennwort verwendet wird?
Diese Frage beschäftigt sich hervorragend mit MySQL-Benutzerauthentifizierung.
Bitte beachten Sie, dass der Primärschlüssel von mysql.user host, user ist. Es gibt keine anderen Indizes. Dies ermöglicht das mehrfache Auftreten eines Benutzernamens. Jedes Vorkommen kann ein anderes Passwort oder kein Passwort haben. Auf diese Weise kann sich der Benutzer 'dbuser' lokal anmelden (dbuser @ localhost), ohne ein Kennwort zu verwenden, und derselbe Benutzer kann sich von einem anderen Server innerhalb eines bestimmten Netzwerkblocks (dbuser@'10.1.2.20 ') mit einem Kennwort wie' pass1 'anmelden und dieser Benutzer muss sich anmelden Remote von überall (dbuser @ '%') mit einem Remote-Passwort wie 'pass2'.
In Anbetracht des von MySQL verwendeten Authentifizierungsalgorithmus gibt es keine Einschränkungen für Benutzer mit oder ohne Kennwort.
Aus diesem Grund wird in den Aufzählungspunkten des MySQL 5.0 Certification Study Guide in Absatz 6 erläutert, wie der Authentifizierungsprozess bereinigt werden kann:
quelle
Der Platzhalter '%' des Hosts stimmt nicht mit 'localhost' überein. Standardmäßig versucht der MySQL-Client, eine Verbindung über einen Socket und nicht über TCP herzustellen (normalerweise an Orten wie /var/lib/mysql/mysql.sock).
Sie können Ihre Berechtigung entweder in 'a' @ 'localhost' ändern oder den Client zwingen, über den TCP-Stack wie folgt zu arbeiten:
quelle
my.cnf
ich diese Option, damit ich diesen Parameter nicht mehr benötige?Haben Sie überprüft, ob MySQL tatsächlich 3306 abhört? Führen Sie ein netstat -tlpn aus und geben Sie die Ergebnisse an. Wenn Sie 3306 nicht sehen, ist es wahrscheinlich nicht.
In my.cnf sollten Sie sicherstellen , dass --skip-networking auskommentiert ist
quelle
Wie in @atxdba beschrieben, müssen Sie zum Herstellen einer Verbindung zum mysql-Daemon von einem Remotestandort aus über TCP eine Verbindung herstellen, der nicht über einen Socket verbunden ist.
Hierzu sollten Sie die
--protocol=TCP
pro Verbindung angeben . Sie können es jedochmy.cnf
auf dem Server einrichten :quelle