Πρώτα επιτρέψτε μου να αναφέρω ότι έχω εξετάσει πολλές προτεινόμενες ερωτήσεις και δεν βρήκα καμία σχετική απάντηση. Ακούστε τι κάνω.
Είμαι συνδεδεμένος με την Amazon EC2 παρουσία μου. Μπορώ να συνδεθώ με το root της MySQL με αυτή την εντολή:
mysql -u root -p
Στη συνέχεια δημιούργησα ένα νέο λογαριασμό χρήστη με host %
CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';
Χορήγησα όλα τα προνόμια στον χρήστη bill:
grant all privileges on *.* to 'bill'@'%' with grant option;
Στη συνέχεια, βγαίνω από τον χρήστη root και προσπαθώ να συνδεθώ με το bill:
mysql -u bill -p
εισάγω τον σωστό κωδικό πρόσβασης και λαμβάνω αυτό το σφάλμα:
ΣΦΑΛΜΑ 1045 (28000): Άρνηση πρόσβασης για τον χρήστη 'bill'@'localhost' (με χρήση κωδικού πρόσβασης: YES)
Όταν έτρεξες
mysql -u bill -p
και πήρατε αυτό το σφάλμα
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Το mysqld περιμένει να συνδεθείτε ως bill@localhost
Προσπαθήστε να δημιουργήσετε το bill@localhost
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
Αν θέλετε να συνδεθείτε από απόσταση, πρέπει να καθορίσετε είτε το όνομα DNS, είτε τη δημόσια IP, είτε το 127.0.0.1 χρησιμοποιώντας το TCP/IP:
mysql -u bill -p [email protected]
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP
Μόλις συνδεθείτε, εκτελέστε το εξής
SELECT USER(),CURRENT_USER();
USER() αναφέρει πώς προσπαθήσατε να πιστοποιηθείτε στη MySQL
Το CURRENT_USER() αναφέρει πώς σας επετράπη η αυθεντικοποίηση στη MySQL από τον πίνακα mysql.user.
Αυτό θα σας δώσει μια καλύτερη εικόνα για το πώς και γιατί σας επετράπη να συνδεθείτε στη mysql. Γιατί είναι σημαντικό να γνωρίζετε αυτή την άποψη; Έχει να κάνει με το πρωτόκολλο παραγγελίας πιστοποίησης ταυτότητας χρήστη.
Ακολουθεί ένα παράδειγμα: Θα δημιουργήσω έναν ανώνυμο χρήστη στην επιφάνεια εργασίας μου MySQL
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)
mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| lwdba | % |
| mywife | % |
| x | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> select user,host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| | % |
| lwdba | % |
| mywife | % |
| lwdba | 127.0.0.1 |
| root | 127.0.0.1 |
| lwdba | localhost |
| root | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)
mysql>
OK παρακολουθήστε με να κάνω login ως ανώνυμος χρήστης:
C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)
Copyright (c) 2000, 2010, 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> select user(),current_user();
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| rol@localhost | @% |
+---------------+----------------+
1 row in set (0.00 sec)
mysql>
Η σειρά ελέγχου ταυτότητας είναι πολύ αυστηρή. Ελέγχει από το πιο συγκεκριμένο προς το λιγότερο συγκεκριμένο. Έγραψα για αυτό το στυλ αυθεντικοποίησης στο DBA StackExchange.
Μην ξεχνάτε να καλέσετε ρητά το TCP ως πρωτόκολλο για τον πελάτη mysql όταν είναι απαραίτητο.
Όταν πληκτρολογείτε mysql -u root -p
, συνδέεστε στον διακομιστή mysql μέσω μιας τοπικής υποδοχής unix.
Ωστόσο, η παραχώρηση που δώσατε, 'bill'@'%'
ταιριάζει περιέργως μόνο με συνδέσεις TCP/IP.
Αν θέλετε να χορηγήσετε πρόσβαση στην τοπική unix socket, πρέπει να χορηγήσετε δικαιώματα στο 'bill'@'localhost' , το οποίο περιέργως δεν είναι το ίδιο με το 'bill'@'127.0.0.1',
Θα μπορούσατε επίσης να συνδεθείτε χρησιμοποιώντας το TCP/IP με τον πελάτη της γραμμής εντολών mysql, ώστε να ταιριάζει με τα δικαιώματα που έχετε ήδη χορηγήσει, π.χ. εκτελέστε mysql -u root -p -h 192.168.1.123
ή όποια τοπική διεύθυνση IP έχει το κουτί σας.