Errore MySQL: accesso negato per l'utente "a" @ "localhost" (utilizzando la password: SÌ)


22

Uso l'account di root creato l'account 'a'@'%'. Ma non riesco a utilizzare l'account per connettermi al server MySQL quando specifico il parametro host. Posso collegarmi con successo senza il -hparametro. Si prega di consultare la trascrizione di seguito. Spero che qualcuno mi possa aiutare a spiegarlo. Grazie.

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> 

Modificare:

Sì, MySQL è in ascolto sulla porta 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 ~]# 

1
Non sono uno specialista in MySql, ma ho visto questo problema alcune volte, non so quale fosse la ragione, la soluzione era esplicitamente la definizione di host in aggiunta a 'a'@'%'. così, il primo disco è stato 'a'@'%', e il secondo è 'a'@'localhost'.
Com

puoi per favore testare la stessa cosa con la versione mysql inferiore ..?
Abdul Manaf,

utilizzare i dettagli di accesso di Cpanel per connettersi.
Abu Fahim,

Nel mio caso avevo tre account anonimi creati per impostazione predefinita, eliminarli per risolvere questo problema
Joaquín L. Robles,

Risposte:


26

Ecco un metodo rapido per verificare come MySQL esegue correttamente l'autenticazione.

Si prega di eseguire questa query:

SELECT USER(),CURRENT_USER();

USER () riporta come hai tentato di autenticarti in mysqld

CURRENT_USER () riporta come ti è stato permesso di autenticarti da mysqld

A volte, USER()e CURRENT_USER()sono diversi. Questo perché l'autenticazione mysql segue un protocollo specifico.

Secondo la guida allo studio di certificazione MySQL 5.0

inserisci qui la descrizione dell'immagine

le pagine 486.487 indicano quanto segue sull'algoritmo di autenticazione di mysql:

Esistono due fasi del controllo dell'accesso client:

Nella prima fase, un client tenta di connettersi e il server accetta o rifiuta la connessione. Affinché il tentativo abbia esito positivo, alcune voci nella tabella utente devono corrispondere all'host da cui si connette il client, il nome utente e la password.

Nella seconda fase (che si verifica solo se un client si è già connesso correttamente), il server controlla ogni query che riceve dal client per vedere se il client dispone di privilegi sufficienti per eseguirlo.

Il server confronta un client con le voci nelle tabelle di concessione in base all'host da cui il client si connette e all'utente fornito dal client. Tuttavia, è possibile che più di un record corrisponda:

I valori host nelle tabelle delle sovvenzioni possono essere specificati poiché i pattern contengono valori jolly. Se una tabella concessione contiene voci da myhost.example.com, %.example.com, %.come %, tutti corrispondono un cliente che si collega da myhost.example.com.

I pattern non sono consentiti per i valori utente nelle voci della tabella di concessione, ma è possibile assegnare un nome utente come stringa vuota per specificare un utente anonimo. La stringa vuota corrisponde a qualsiasi nome utente e quindi agisce efficacemente come carattere jolly.

Quando i valori Host e User in più di un record della tabella utente corrispondono a un client, il server deve decidere quale utilizzare. Lo fa ordinando prima i record con i valori di colonna Host e User più specifici e scegliendo il record corrispondente che si verifica per primo nell'elenco ordinato, l'ordinamento avviene come segue:

Nella colonna host, valori letterali come localhost, 127.0.0.1e l' myhost.example.comordinamento prima di valori come quelli %.example.com che contengono caratteri di pattern in essi. I valori dei motivi sono ordinati in base alla loro specificità. Ad esempio, %.example.comè più specifico di %.com, che è più specifico di %.

Nella colonna Utente, i nomi utente non vuoti vengono ordinati prima dei nomi utente vuoti. Cioè, gli utenti non anonimi ordinano prima degli utenti anonimi.

Il server esegue questo ordinamento all'avvio. Legge le tabelle delle autorizzazioni in memoria, le ordina e utilizza le copie in memoria per il controllo degli accessi.

Da questa descrizione, non è necessario preoccuparsi dell'ordine delle tabelle mysql.user poiché esiste una copia in memoria delle tabelle di concessione che viene ordinata come precedentemente menzionato.

Per quanto riguarda il modo in cui hai effettuato l'accesso, ha mysql -u afunzionato solo . Torna indietro e accedi di nuovo ed esegui questi comandi

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

Assicurati che

  • ogni utente ha una password.
  • non ci sono utenti anonimi (quando l'utente è vuoto)

Questa è solo una supposizione, ma sospetto mysql -u adi connettersi tramite localhost perché quando il protocollo di connessione non è specificato, il valore predefinito è connettersi tramite il file socket. Potrebbe esistere una voce mysql.userche consente la connessione anonimo localhost.

Esegui questa query:

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

Se torni a una riga senza password, questo spiega completamente perché mysq -u afunziona.

AGGIORNAMENTO 2012-01-19 11:12 EDT

Craig Efrein ha sollevato una domanda interessante: se nella tabella mysql.user esistono due nomi utente identici, uno con una password e uno senza, ciò significa che MySQL nega l'autenticazione quando non si utilizza una password?

Questa domanda è un eccellente avvertimento sull'autenticazione utente MySQL.

La chiave primaria di mysql.user è host, utente. Non ci sono altri indici. Ciò consente più occorrenze di un nome utente. Ogni ricorrenza può avere una password diversa o nessuna password. Ciò consente all'utente 'dbuser' di accedere localmente (dbuser @ localhost) senza password e lo stesso utente effettua l'accesso da un altro server all'interno di un determinato netblock (dbuser@'10.1.2.20 ') con una password come' pass1 'e quell'utente effettua l'accesso da remoto ovunque (dbuser @ '%') con una password remota come 'pass2'.

Dato l'algoritmo di autenticazione utilizzato da MySQL, non vi sono restrizioni per gli utenti con la presenza o l'assenza di una password.

Questo è il motivo per cui la Guida allo studio sulla certificazione MySQL 5.0 dice a pagina 498 Il paragrafo 6 nei suoi punti elenco illustra come pulire il processo di autenticazione:

Su Unix, MySQL viene fornito con uno script mysql_secure_installation che può eseguire diverse utili operazioni di sicurezza sulla tua installazione. Lo script ha le seguenti funzionalità:

  • Imposta una password per gli account di root
  • Rimuovere eventuali account root accessibili in remoto.
  • Rimuovi gli account utente anonimo. Ciò migliora la sicurezza perché impedisce a chiunque di connettersi al server MySQL come root da un host remoto. Il risultato è che chiunque desideri connettersi come root deve prima essere in grado di accedere all'host del server, il che fornisce una barriera aggiuntiva contro gli attacchi.
  • Rimuovere il database di prova (se si rimuovono gli account anonimi, è possibile che si desideri rimuovere anche il database di prova a cui hanno accesso).

Sì, ho provato, restituisce una riga senza password. Grazie per la tua eccellente spiegazione e consigliato il libro di certificazione MySQL.
Solo uno studente il

2
Rolando, se nella tabella mysql.user esistono due nomi utente identici, uno con una password e uno senza, ciò significa che MySQL nega l'autenticazione quando non si utilizza una password?
Craig Efrein,

@Craig - La tua domanda è molto degna di nota. Lo trasferirò nella mia risposta e lo indirizzerò lì.
RolandoMySQLDBA

Grazie per la risposta dettagliata, nel mio caso avevo configurato utenti anonimi in qualche modo.
SoWeLie,

@RolandoMySQLDBA, Tutte le informazioni nella guida allo studio di certificazione sono già presenti nel manuale online di MySQL?
Pacerier,

5

Il carattere jolly host '%' non corrisponde a 'localhost'. Per impostazione predefinita, il client mysql proverà a connettersi tramite un socket anziché tramite tcp (di solito in un posto come /var/lib/mysql/mysql.sock).

È possibile modificare la concessione in "a" @ "localhost" o forzare il client a operare sullo stack TCP come:

mysql -u a -p --protocol=TCP

Ci ho provato, ma ancora senza fortuna.
Solo uno studente il

Come configurare questa opzione my.cnfper non aver più bisogno di questo parametro?
shgnInc,

1
Non Se non si specifica un nome -h host, assume che "localhost" significhi che sta cercando un socket, non una porta TCP senza il flag di protocollo. Puoi impostare una shell anche se sei stanco di scrivere tutti gli argomenti.
atxdba,

2

Hai controllato per assicurarti che MySQL stia effettivamente ascoltando il 3306? Esegui un netstat -tlpn e fornisci i risultati. Se non vedi 3306, probabilmente non lo è.

In my.cnf dovresti verificare che --skip-networking sia commentato

[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

Ho anche fatto lo stesso della domanda. e ha anche fatto quello che dici nella tua risposta, ma c'è ancora lo stesso problema.
Abdul Manaf, il

Potete fornire i risultati dalla seguente query: selezionare user, host da mysql.user;
Craig Efrein il

Sì, MySQL è in ascolto sulla porta 3306. Vedi la mia modifica.
Solo uno studente il

Puoi anche provare mysql -u user -p -h 127.0.0.1. Se funziona, credo che sia mysql che non sa come risolvere localhost. Una voce per localhost che punta a 127.0.0.1 nel tuo file / etc / hosts lo risolverà.
Craig Efrein il

Hai eseguito Privilegi a filo?
Craig Efrein il

1

Come descritto da @atxdba, per connettere il demone mysql da remoto che non si connette tramite socket, è necessario connettersi da remoto tramite TCP.

Per questo, è necessario specificare il --protocol=TCPper ogni connessioni. Tuttavia, è possibile impostarlo my.cnfsul server:

[client]
protocol=tcp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.