Accesso root MySQL da tutti gli host


152

Ho installato il server MySQL su una macchina Ubuntu remota. L' rootutente è definito nella mysql.usertabella in questo modo:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Posso accedere con l'utente rootdalla stessa interfaccia della riga di comando della macchina remota utilizzando il mysqlclient standard . Ora voglio consentire l'accesso come root da tutti gli host su Internet , quindi ho provato ad aggiungere la seguente riga (è un duplicato esatto della prima riga dal dump precedente, ad eccezione della hostcolonna):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Ma il mio client sul mio PC personale continua a dirmi (ho oscurato l'IP del server):

Errore SQL (2003): impossibile connettersi al server MySQL su '46 .xxx '(10061)

Non so dire se si tratta di un errore di autenticazione o di un errore di rete. Sul firewall del server ho abilitato la porta 3306 / TCP per 0.0.0.0/0 , e per me va bene ...


puoi telnet alla macchina sulla porta 3306
mihaisimi,

3
molto probabilmente il demone MySQL non ascolta su 46.xxx ma solo su localhost. Cerca bind-addressin my.cnf
Maxim Krizhanovsky il

1
Quindi, world + dog ora ha l'hash della tua password di root, la consapevolezza che root è accessibile da qualsiasi host su Internet e il primo byte del tuo indirizzo IP. Non pensi che questo è solo un piccolo po 'riguardante?
Eggyal,

possibile duplicato di Abilita connessione remota MySQL
utente

Risposte:


362

Ci sono due passaggi in questo processo:

a) Concedere i privilegi. Come utente root eseguire con questa sostituzione 'password'con la password di root corrente:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) si legano a tutti gli indirizzi:

Il modo più semplice è commentare la riga nel tuo my.cnffile:

#bind-address = 127.0.0.1 

e riavvia mysql

service mysql restart

Di default si lega solo a localhost, ma se commentate la linea si lega a tutte le interfacce che trova. Commentare la riga equivale a bind-address=*.

Per verificare dove è stato associato il servizio mysql eseguire come root:

netstat -tupan | grep mysql

Aggiornamento per Ubuntu 16:

Il file di configurazione è (ora)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(almeno su Ubuntu standard 16)


5
Ok, il problema era l'indirizzo vincolante. Grazie. @Darhazer Grazie anche a te :)
lorenzo-s,

2
Per richiedere le sovvenzioni correnti: `MOSTRA SOVVENZIONI PER 'root' @ '%';
Robsch,

5
Per consentire anche a root @% di concedere le autorizzazioni ad altri utenti, immediatamente dopo il passaggio (a) eseguire: GRANT USAGE ON *. * TO 'root' @ '%' CON OPZIONE GRANT;
Caleb,

1
Il file di configurazione è (ora) /etc/mysql/mysql.conf.d/mysqld.cnf (almeno su Ubuntu standard 16)
jgp

2
Avevo solo bisogno di fare questo, per essere in grado di connettermi in remoto al server in remoto:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Esegui la seguente query:

use mysql;

update user set host='%' where host='localhost'

NOTA: non raccomandato per l'uso in produzione.


2
Questa non è la soluzione perfetta. Potrebbe funzionare Per me ha prodotto un errore: ERRORE 1062 (23000): voce duplicata '% -root' per la chiave 'PRIMARY'
Scriptlabs

2
@Scriptlabs, è probabile che ci siano più voci nella tabella utente con un host di 'localhost'. E più di una riga con root, inclusi root.localhost, root.127.0.0.1, root.::1. Quindi è meglio aggiungere un utente separato piuttosto che aggiornare, motivo per cui sto votando a fondo in giù questa risposta.
Mike Purcell,

4
non è FLUSH PRIVILEGES; anche necessario subito dopo?
Nom1fan,

1
questo funziona per me. prova questo. update mysql.user set host='%' where user='root'
nur zazin,

7

Qualche volta

bind-address = 127.0.0.1

dovrebbe essere

bind-address = *


7

MYSQL 8.0 - aprire il client della riga di comando mysql
CONCESSIONE DI TUTTI I PRIVILEGI SU *. * A 'root' @ 'localhost';
usa mysql
UPDATE mysql.user SET host = '%' DOVE utente = 'root';
Riavvia il servizio mysql


4

MariaDB in esecuzione su Raspbian - il file contenente l'indirizzo di bind è difficile da individuare. MariaDB ha alcune informazioni non molto utili sull'argomento.

ero solito

# sudo grep -R bind-address /etc 

per individuare dov'è la dannata cosa.

Ho anche dovuto impostare i privilegi e gli host nel mysql come tutti quelli sopra indicati.

E mi sono anche divertito ad aprire la porta 3306 per le connessioni remote al mio Raspberry Pi - finalmente usato iptables-persistent .

Ora funziona tutto alla grande.


1

se hai molte reti collegate al tuo sistema operativo, devi specificare una di queste reti nel bind-addres dal file my.conf. un esempio:

[mysqld]
bind-address = 127.100.10.234

questo ip proviene da una configurazione ethX.


1
Si prega di aggiungere maggiori dettagli. In quale file o framework deve avvenire tale impostazione? Sii più specifico sulla configurazione di ethX.
BPS

1

Nel mio caso l'impostazione "bind-address" era il problema. Commentare questa impostazione my.cnfnon ha aiutato, perché nel mio caso mysql ha impostato il valore predefinito su 127.0.0.1 per qualche motivo.

Per verificare quale impostazione MySql sta attualmente utilizzando, apri la riga di comando nella casella locale:

mysql -h localhost -u myname -pmypass mydb

Leggi l'impostazione corrente:

Show variables where variable_name like "bind%"

Dovresti vedere 0.0.0.0 qui se vuoi consentire l'accesso da tutti gli host. In caso contrario, modifica il tuo /etc/mysql/my.cnfe imposta bind-address nella sezione [mysqld]:

bind-address=0.0.0.0

Infine riavvia il tuo server MySql per selezionare la nuova impostazione:

sudo service mysql restart

Riprova e controlla se la nuova impostazione è stata ritirata.


-2

mysql_update è quello che ti serve.

Non so perché qualcuno segua i modi più complessi per correggere questo problema, quando MySql ha gentilmente creato uno strumento che già lo fa ...

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.