MySQL hatası: 'a' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: YES)


22

Hesabı oluşturulan kök hesabı kullanıyorum 'a'@'%'. Ancak host parametresini belirlerken MySQL sunucusuna bağlanmak için hesabı kullanamıyorum. -hParametre olmadan başarıyla bağlanabilirim . Lütfen aşağıdaki yazıya bakınız. Umarım biri açıklamam için bana yardım edebilir. Teşekkürler.

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> 

Düzenle:

Evet, MySQL 3306 numaralı bağlantı noktasını dinliyor.

[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 ~]# 

1
MySQL'de uzman değilim, ancak bu sorunu birkaç kez gördüm, nedenini bilmiyorum, çözüm açıkça ana bilgisayarın tanımıydı 'a'@'%'. öyleyse ilk kayıt, 'a'@'%'ikinci kayıt oldu 'a'@'localhost'.
com

mysql versiyonu ile aynı şeyi test edebilir misiniz ..?
Abdul Manaf

Bağlanmak için Cpanel Giriş Ayrıntılarını kullanın.
Abu Fahim,

Benim durumumda, varsayılan olarak oluşturulan üç isimsiz hesabım vardı, onları silmek bu sorunu çözecektir
Joaquín L. Robles

Yanıtlar:


26

İşte MySQL'in başarılı kimlik doğrulamasını nasıl yaptığını kontrol etmek için hızlı ve kirli bir yöntem.

Lütfen bu sorguyu çalıştırın:

SELECT USER(),CURRENT_USER();

USER () , mysqld'de nasıl kimlik doğrulaması yapmaya çalıştığınızı bildirir.

CURRENT_USER () , mysqld ile kimliğinizi nasıl doğruladığınızı bildirir

Bazen USER()ve CURRENT_USER()farklı. Bunun nedeni, mysql kimlik doğrulamasının belirli bir protokolü izlemesidir.

Göre MySQL 5.0 Belgelendirme Eğitim Kılavuzu

görüntü tanımını buraya girin

sayfa 486,487, mysql'in kimlik doğrulama algoritmasında aşağıdakileri belirtir:

İstemci erişim kontrolünün iki aşaması vardır:

İlk aşamada, bir müşteri bağlanmaya çalışır ve sunucu bağlantıyı kabul eder veya reddeder. Başarılı olma denemesi için, kullanıcı tablosundaki bazı girdilerin müşterinin bağlandığı ana bilgisayar, kullanıcı adı ve şifre ile eşleşmesi gerekir.

İkinci aşamada (yalnızca bir müşteri başarılı bir şekilde bağlandıysa gerçekleşir), sunucu istemciden aldığı her sorguyu, istemcinin yürütmek için yeterli ayrıcalıklara sahip olup olmadığını kontrol eder.

Sunucu, bir müşteriyi bağlandığı ana bilgisayara ve müşterinin sağladığı kullanıcıya bağlı olarak hibe tablolarındaki girişlerle eşleştirir. Ancak, birden fazla kaydın eşleşmesi mümkündür:

Hibe tablolarındaki ana bilgisayar değerleri, desenler joker karakterler içerdiğinden belirtilebilir. Hibe tablo girdileri gelen içeriyorsa myhost.example.com, %.example.com, %.com, ve %, hepsinden bağlayan bir müşteri maç myhost.example.com.

Hibe tablosu girişlerinde Kullanıcı değerleri için kalıplara izin verilmez, ancak adsız bir kullanıcı belirtmek için bir kullanıcı adı boş bir dize olarak verilebilir. Boş dize herhangi bir kullanıcı adıyla eşleşir ve bu sayede joker karakter olarak etkin bir şekilde hareket eder.

Birden fazla kullanıcı tablosu kaydındaki Ana Bilgisayar ve Kullanıcı değerleri bir istemciyle eşleştiğinde, hangisinin kullanılacağına karar vermesi gerekir. Bunu, ilk önce en belirli Ana Bilgisayar ve Kullanıcı sütun değerlerine sahip kayıtları sıralayarak ve sıralama listesinde ilk sırada yer alan eşleşen kaydı seçerek yapar: Sıralama şu şekilde yapılır:

Sunucu Sütun olarak, örneğin edebi değerler localhost, 127.0.0.1ve myhost.example.comsıralama öncesinde gibi değerlerin %.example.com onlara desen karakterler var. Desen değerleri, ne kadar spesifik olduklarına göre sıralanır. Örneğin, %.example.comolduğundan daha belirgin olandan %.comdaha belirgindir %.

Kullanıcı sütununda boş olmayan kullanıcı adları, boş kullanıcı adlarından önce sıralanır. Yani, isimsiz kullanıcılar isimsiz kullanıcıların önüne geçerler.

Sunucu başladığında bu sıralama gerçekleştirir. Hibe tablolarını belleğe okur, sıralar ve bellekteki kopyaları erişim kontrolü için kullanır.

Bu açıklamadan, mysql.user tablolarının sırası hakkında endişelenmenize gerek yoktur, çünkü daha önce belirtildiği gibi sıralanmış hibe tablolarının hafıza içi bir kopyası vardır.

Nasıl giriş yaptığınıza gelince, sadece mysql -u açalıştı. Geri dönün ve tekrar giriş yapın ve bu komutları çalıştırın

SELECT USER(),CURRENT_USER();
SELECT user,host,password FROM mysql.user;

Emin olun

  • Her kullanıcının bir şifresi vardır.
  • isimsiz kullanıcı yok (kullanıcı boş olduğunda)

Bu sadece bir tahmin, ancak mysql -u alocalhost ile bağlanma şüphesi var , çünkü bağlantı protokolü belirtilmediğinde, varsayılan soket dosyası üzerinden bağlanmak. mysql.userAnonim localhost bağlantısına izin veren bir giriş olabilir .

Bu sorguyu çalıştır:

SELECT user,host,password FROM mysql.user WHERE user='' AND host='localhost';

Parola olmadan bir satır geri alırsanız, bu neden mysq -u aişe yaradığını tamamen açıklar .

GÜNCELLEME 2012-01-19 11:12 EDT

Craig Efrein ilginç bir soruyu gündeme getirdi: mysql.user tablosunda iki tane aynı kullanıcı adı varsa, biri şifreli ve biri olmasaydı, bu MySQL'in şifre kullanmıyorken kimlik doğrulamasını reddettiği anlamına mı geliyor?

Bu soru MySQL kullanıcı kimlik doğrulaması hakkında mükemmel bir bilgidir.

Mysql.user dosyasının ana anahtarının ana bilgisayar, kullanıcı olduğunu lütfen unutmayın. Başka indeks yok. Bu, bir kullanıcı adının birden fazla oluşumuna izin verir. Her olayın farklı bir şifresi olabilir veya şifresi olmayabilir. Bu, kullanıcının 'dbuser' şifresiz kullanarak yerel olarak giriş yapmasına (dbuser @ localhost) ve aynı kullanıcı belirli bir ağ bloğu içindeki başka bir sunucudan giriş yapmasına izin verir (dbuser@'10.1.2.20 ') ve' pass1 'gibi bir şifre ile giriş yapar. 'pass2' gibi uzak bir parola ile uzaktan herhangi bir yerden (dbuser @ '%').

MySQL'in kullandığı kimlik doğrulama algoritması göz önüne alındığında, kullanıcılara parola varlığı veya yokluğu konusunda herhangi bir kısıtlama yoktur.

Bu nedenle, MySQL 5.0 Sertifikasyon Çalışma Kılavuzu'nun madde işaretleri paragraf 6'da belirtildiği gibi, kimlik doğrulama işleminin nasıl temizleneceği açıklanmaktadır:

Unix'te MySQL, kurulumunuzda güvenlikle ilgili birçok yararlı işlemi gerçekleştirebilen bir mysql_secure_installation betiğiyle birlikte gelir. Komut aşağıdaki yeteneklere sahiptir:

  • Kök hesaplar için bir şifre belirleyin
  • Uzaktan erişilebilen kök hesapları kaldırın.
  • Anonim kullanıcı hesaplarını kaldırın. Bu, güvenliği artırdığı için, MySQL sunucusuna uzak bir ana bilgisayardan root olarak bağlanma olanağını engeller. Sonuç olarak, root olarak bağlanmak isteyen herkes ilk önce sunucu ana bilgisayarında oturum açabilmelidir, bu da saldırıya karşı ek bir engel oluşturur.
  • Test veritabanını kaldırın (Anonim hesapları kaldırırsanız, erişebildikleri test veritabanını da kaldırmak isteyebilirsiniz).

Evet denedim, şifresiz bir satır döndürür. Mükemmel açıklamanız için teşekkür ederiz ve MySQL sertifikasyon kitapçığını tavsiye edin.
sadece bir öğrenci

2
Rolando, mysql.user tablosunda iki ve aynı kullanıcı adı varsa, biri şifreli ve biri olmayan bir tane varsa, bu MySQL'in şifre kullanmıyorken kimlik doğrulamasını reddettiği anlamına mı geliyor?
Craig Efrein

@Craig - Sorunuz çok dikkat çekici. Cevaplarıma aktarıp orada konuşacağım.
RolandoMySQLDBA

Ayrıntılı cevap için teşekkür ederim, benim durumumda anonim kullanıcıları bir şekilde yapılandırdım.
SoWeLie

@RolandoMySQLDBA, Sertifikasyon çalışma kılavuzundaki tüm bilgiler zaten MySQL çevrimiçi kılavuzunda bulunabilir mi?
Pacerier

5

'%' Ana bilgisayar joker karakteri 'localhost' ile eşleşmiyor. Varsayılan olarak mysql istemcisi tcp yerine bir soket üzerinden bağlanmayı deneyecektir (genellikle /var/lib/mysql/mysql.sock gibi bir yer).

Yardımınızı 'a' @ 'localhost' olarak değiştirebilir veya istemciyi aşağıdaki gibi TCP yığını üzerinde işlemesi için zorlayabilirsiniz:

mysql -u a -p --protocol=TCP

Denedim, ama hala şanssız.
Sadece bir öğrenci

my.cnfArtık bu parametreye ihtiyaç duyulmadığı için bu seçenek nasıl yapılandırılır ?
shgnInc

1
Sen değil. Bir -h ana bilgisayar adı belirtmezseniz, "localhost" olduğu varsayılır, bu protokol bayrağı olmayan bir TCP bağlantı noktası değil de soket aradığı anlamına gelir. Tüm argümanları yazmaktan yorulduysanız, bir kabuk diğer adı kurabilirsiniz.
atxdba

2

MySQL'in aslında 3306'yı dinlediğinden emin olmak için kontrol ettin mi? Bir netstat -tlpn çalıştırın ve sonuçları verin. 3306 göremiyorsanız, o zaman muhtemelen değil.

Gelen my.cnf o --skip-ağ dışarı yorum doğrulamalıdır

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
language        = /usr/share/mysql/English
bind-address    = 65.55.55.2
# skip-networking

Ayrıca soruda sorulduğu gibi yaptım. ve cevabında söylediklerini yaptın ama yine de aynı sorun var.
Abdul Manaf

Aşağıdaki sorgudan sonuçları sağlayabilir misiniz: user, host from mysql.user;
Craig Efrein

Evet, MySQL 3306 numaralı bağlantı noktasını dinliyor. Düzenlemeye bakınız.
bir öğrenci

Ayrıca mysql -u user -p -h 127.0.0.1 programını denemek isteyebilirsiniz. Bu işe yararsa o zaman localhost'un nasıl çözüleceğini bilmeyen mysql'ye inanıyorum. / Etc / hosts dosyanızda 127.0.0.1’e işaret eden localhost girişi bu sorunu çözecektir.
Craig Efrein

Flush Privileges'i çalıştırdın mı?
Craig Efrein

1

@ Atxdba'nın açıkladığı gibi, mysql arka planını soketle bağlanmayan uzaktaki bir bilgisayara bağlamak için, uzaktaki TCP üzerinden bağlanmanız gerekir.

Bunun için --protocol=TCPher bağlantı için ayrı ayrı belirtmeniz gerekir . Bununla my.cnfbirlikte, sunucuda ayarlayabilirsiniz :

[client]
protocol=tcp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.