Używam konta root, które utworzyło konto 'a'@'%'
. Ale nie mogę używać konta do łączenia się z serwerem MySQL, gdy podam parametr hosta. Mogę pomyślnie połączyć się bez -h
parametru. Zobacz zapis poniżej. Mam nadzieję, że ktoś może mi pomóc to wyjaśnić. Dzięki.
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>
Edytować:
Tak, MySQL nasłuchuje na porcie 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
Tylko uczeń
źródło
źródło
'a'@'%'
. więc pierwsza płyta była'a'@'%'
, a druga jest'a'@'localhost'
.Odpowiedzi:
Oto szybka i brudna metoda sprawdzenia, w jaki sposób MySQL wykonuje udane uwierzytelnianie.
Uruchom to zapytanie:
USER () informuje o próbie uwierzytelnienia w mysqld
CURRENT_USER () informuje, w jaki sposób zezwolono Ci na uwierzytelnianie przez mysqld
Czasami
USER()
iCURRENT_USER()
są inne. Jest tak, ponieważ uwierzytelnianie mysql odbywa się według określonego protokołu.Zgodnie z MySQL 5.0 Certification Study Guide
strony 486,487 zawierają następujące informacje na temat algorytmu uwierzytelniania mysql:
Na podstawie tego opisu nie musisz martwić się o kolejność tabel mysql.user, ponieważ istnieje w pamięci kopia tabel grantu, które są sortowane jak wspomniano wcześniej.
Jeśli chodzi o sposób logowania,
mysql -u a
działało tylko . Wróć i zaloguj się ponownie i uruchom te poleceniaUpewnij się, że
To tylko zgadywanie, ale podejrzewam
mysql -u a
, że łączę się przez localhost, ponieważ gdy nie określono protokołu połączenia, domyślnie jest to połączenie za pomocą pliku gniazda. Może istnieć wpis,mysql.user
który pozwala na anonimowe połączenie localhost.Uruchom to zapytanie:
Jeśli wrócisz wiersz bez hasła, to w pełni wyjaśnia, dlaczego
mysq -u a
działa.AKTUALIZACJA 19.01.2012 11:12 EDT
Craig Efrein podniósł interesujące pytanie: jeśli w tabeli mysql.user istnieją dwie identyczne nazwy użytkowników, jedna z hasłem, a druga bez, czy to oznacza, że MySQL odmawia uwierzytelnienia, gdy nie używa hasła?
To pytanie stanowi doskonałą odpowiedź na temat uwierzytelniania użytkownika MySQL.
Należy pamiętać, że kluczem podstawowym mysql.user jest host, użytkownik. Brak innych indeksów. Pozwala to na wielokrotne występowanie nazwy użytkownika. Każde wystąpienie może mieć inne hasło lub może nie mieć hasła. Dzięki temu użytkownik „dbuser” może zalogować się lokalnie (dbuser @ localhost) bez hasła i ten sam login użytkownika z innego serwera w obrębie danego bloku sieciowego (dbuser@'10.1.2.20 ') przy użyciu hasła takiego jak „pass1”, a ten użytkownik może się zalogować zdalnie z dowolnego miejsca (dbuser @ '%') za pomocą hasła zdalnego, takiego jak „pass2”.
Biorąc pod uwagę algorytm uwierzytelniania używany przez MySQL, nie ma żadnych ograniczeń dotyczących użytkowników z obecnością lub brakiem hasła.
Oto dlaczego Przewodnik po certyfikacji MySQL 5.0 na str. 6 w punktach końcowych wyjaśnia, jak wyczyścić proces uwierzytelniania:
źródło
Symbol wieloznaczny hosta „%” nie pasuje do „localhost”. Domyślnie klient mysql będzie próbował połączyć się przez gniazdo, a nie tcp (zwykle w miejscu /var/lib/mysql/mysql.sock).
Możesz zmienić przydział na „@” „localhost” lub zmusić klienta do działania na stosie TCP, np .:
źródło
my.cnf
aby nie trzeba już było tego parametru?Czy sprawdziłeś, czy MySQL faktycznie nasłuchuje na 3306? Uruchom komendę netstat -tlpn i podaj wyniki. Jeśli nie widzisz 3306, to prawdopodobnie nie.
W my.cnf powinieneś sprawdzić, czy --skip-networking jest skomentowany
źródło
Jak opisano w @atxdba, aby połączyć demona mysql ze zdalnego, który nie łączy się przez gniazdo, musisz połączyć się ze zdalnego za pomocą TCP.
W tym celu należy określić
--protocol=TCP
dla każdego połączenia. Chociaż możesz ustawić gomy.cnf
na serwerze:źródło