Saya menggunakan akun root membuat akun 'a'@'%'
. Tapi saya tidak bisa menggunakan akun untuk terhubung ke server MySQL ketika saya menentukan parameter host. Saya dapat berhasil terhubung tanpa -h
parameter. Silakan lihat transkrip di bawah ini. Saya harap seseorang dapat membantu saya menjelaskannya. Terima kasih.
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>
Edit:
Ya, MySQL mendengarkan pada 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
Hanya seorang pembelajar
sumber
sumber
'a'@'%'
. jadi, catatan pertama adalah'a'@'%'
, dan yang kedua adalah'a'@'localhost'
.Jawaban:
Berikut adalah metode cepat dan kotor untuk memeriksa bagaimana MySQL melakukan otentikasi yang berhasil.
Silakan jalankan kueri ini:
USER () melaporkan bagaimana Anda mencoba mengotentikasi di mysqld
CURRENT_USER () melaporkan bagaimana Anda diizinkan untuk mengautentikasi oleh mysqld
Terkadang,
USER()
danCURRENT_USER()
berbeda. Itu karena otentikasi mysql mengikuti protokol tertentu.Menurut Panduan Studi Sertifikasi MySQL 5.0
halaman 486.487 menyatakan berikut ini pada algoritma otentikasi mysql:
Dari uraian ini, Anda tidak perlu khawatir tentang urutan tabel mysql.user karena ada salinan dalam memori dari tabel hibah yang diurutkan seperti yang disebutkan sebelumnya.
Berkenaan dengan bagaimana Anda masuk, hanya
mysql -u a
berfungsi. Kembali dan masuk lagi dan jalankan perintah iniPastikan bahwa
Ini hanya dugaan, tetapi saya curiga
mysql -u a
menghubungkan melalui localhost karena ketika protokol koneksi tidak ditentukan, defaultnya adalah untuk terhubung melalui file socket. Mungkin ada entri dimysql.user
yang memungkinkan koneksi host lokal anonim.Jalankan kueri ini:
Jika Anda mendapatkan kembali baris tanpa kata sandi, itu sepenuhnya menjelaskan alasannya
mysq -u a
berfungsi.UPDATE 2012-01-19 11:12 EDT
Craig Efrein memunculkan pertanyaan yang menarik: jika dua nama pengguna yang identik ada di tabel mysql.user, satu dengan kata sandi dan satu tanpa, apakah itu berarti bahwa MySQL menolak otentikasi ketika tidak menggunakan kata sandi?
Pertanyaan ini adalah pertanyaan bagus tentang otentikasi pengguna MySQL.
Harap dicatat bahwa kunci utama mysql.user adalah host, pengguna. Tidak ada indeks lain. Ini memungkinkan beberapa kemunculan nama pengguna. Setiap kejadian dapat memiliki kata sandi yang berbeda atau tanpa kata sandi. Hal ini memungkinkan pengguna 'dbuser' untuk login secara lokal (dbuser @ localhost) tanpa menggunakan kata sandi dan pengguna yang sama login dari server lain dalam netblock yang diberikan (dbuser@'10.1.2.20 ') dengan kata sandi seperti' pass1 'dan pengguna untuk login dari jarak jauh dari mana saja (dbuser @ '%') dengan kata sandi jarak jauh seperti 'pass2'.
Mengingat algoritma otentikasi yang digunakan MySQL, tidak ada batasan yang ditempatkan pada pengguna dengan ada atau tidak adanya kata sandi.
Inilah sebabnya mengapa Panduan Studi Sertifikasi MySQL 5.0 mengatakan pada Halaman 498 Paragraf 6 di bulletpointsnya mengungkap cara membersihkan proses otentikasi:
sumber
Wildcard host '%' tidak cocok dengan 'localhost'. Secara default, klien mysql akan mencoba untuk terhubung melalui soket daripada tcp (biasanya beberapa tempat seperti /var/lib/mysql/mysql.sock).
Anda dapat mengubah dana bantuan menjadi 'a' @ 'localhost', atau memaksa klien untuk beroperasi melalui tumpukan TCP seperti:
sumber
my.cnf
agar tidak perlu lagi menggunakan parameter ini?Apakah Anda memeriksa untuk memastikan bahwa MySQL benar-benar mendengarkan pada 3306? Jalankan netstat -tlpn dan berikan hasilnya. Jika Anda tidak melihat 3306 maka mungkin tidak.
Di my.cnf Anda harus memverifikasi bahwa --skip-networking dikomentari
sumber
Seperti yang dijelaskan oleh @atxdba, Untuk menghubungkan daemon mysql dari jarak jauh yang tidak terhubung melalui soket, maka Anda harus terhubung dari jarak jauh melalui TCP.
Untuk ini, Anda harus menentukan
--protocol=TCP
per setiap koneksi. Meskipun, Anda dapat mengaturnya dimy.cnf
server:sumber