Accès racine MySQL depuis tous les hôtes


152

J'ai installé le serveur MySQL sur une machine Ubuntu distante. L' rootutilisateur est défini dans le mysql.usertableau de cette manière:

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 |
+------------------+------+-------------------------------------------+

Je peux accéder avec l'utilisateur à rootpartir de la même interface de ligne de commande de machine distante en utilisant le mysqlclient standard . Maintenant, je veux autoriser l'accès root à partir de chaque hôte sur Internet , j'ai donc essayé d'ajouter la ligne suivante (c'est une copie exacte de la première ligne du vidage précédent, à l'exception de la hostcolonne):

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

Mais mon client sur mon PC personnel continue de me dire (j'ai obscurci l'adresse IP du serveur):

Erreur SQL (2003): impossible de se connecter au serveur MySQL sur '46 .xxx '(10061)

Je ne peux pas dire s'il s'agit d'une erreur d'authentification ou d'une erreur réseau. Sur le pare-feu du serveur, j'ai activé le port 3306 / TCP pour 0.0.0.0/0 , et cela me convient ...


pouvez-vous telnet à la machine sur le port 3306
mihaisimi

3
il est fort probable que le démon MySQL n'écoute pas sur 46.xxx mais uniquement sur localhost. Rechercher bind-addressdans my.cnf
Maxim Krizhanovsky

1
Ainsi, le chien world + a maintenant le hachage de votre mot de passe root, la connaissance que root est accessible depuis n'importe quel hôte sur Internet et le premier octet de votre adresse IP. Vous ne pensez pas que c'est un tout petit peu inquiétant?
eggyal

Réponses:


362

Il y a deux étapes dans ce processus:

a) Accorder des privilèges. En tant qu'utilisateur root, exécutez ce remplacement 'password'par votre mot de passe root actuel:

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

b) se lier à toutes les adresses:

Le moyen le plus simple est de commenter la ligne de votre my.cnffichier:

#bind-address = 127.0.0.1 

et redémarrez mysql

service mysql restart

Par défaut, il se lie uniquement à localhost, mais si vous commentez la ligne, il se lie à toutes les interfaces qu'il trouve. Commenter la ligne équivaut à bind-address=*.

Pour vérifier où le service mysql s'est lié, exécutez en tant que root:

netstat -tupan | grep mysql

Mise à jour pour Ubuntu 16:

Le fichier de configuration est (maintenant)

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

(au moins sur Ubuntu 16 standard)


5
Ok, le problème était l'adresse de liaison. Je vous remercie. @Darhazer Merci aussi :)
lorenzo-s

2
Pour interroger les subventions actuelles: `SHOW GRANTS FOR 'root' @ '%';
robsch

5
Pour permettre également à root @% d'accorder des autorisations à d'autres utilisateurs, exécutez immédiatement après l'étape (a): GRANT USAGE ON *. * TO 'root' @ '%' WITH GRANT OPTION;
Caleb

1
Le fichier de configuration est (maintenant) /etc/mysql/mysql.conf.d/mysqld.cnf (au moins sur Ubuntu 16 standard)
jgp

2
J'avais juste besoin de faire ça, pour pouvoir me connecter à distance au serveur à distance:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Exécutez la requête suivante:

use mysql;

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

REMARQUE: non recommandé pour une utilisation en production.


2
Ce n'est pas la solution parfaite. Cela peut marcher. Pour moi, cela a produit une erreur: ERREUR 1062 (23000): Entrée dupliquée '% -root' pour la clé 'PRIMARY'
Scriptlabs

2
@Scriptlabs, il y a de fortes chances qu'il y ait plus d'une entrée dans la table user avec un hôte de 'localhost'. Et plus d'une ligne avec root, y compris root.localhost, root.127.0.0.1, root.::1. Il vaut donc mieux ajouter un utilisateur distinct plutôt que de mettre à jour, c'est pourquoi je vote contre cette réponse.
Mike Purcell

4
n'est pas FLUSH PRIVILEGES; également nécessaire juste après?
Nom1fan

1
Cela fonctionne pour moi. essaye ça. update mysql.user set host='%' where user='root'
nur zazin

7

quelquefois

adresse de liaison = 127.0.0.1

devrait être

adresse de liaison = *


7

MYSQL 8.0 - ouvre le client de ligne de commande mysql
GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost';
utilisez mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Redémarrez le service mysql


4

MariaDB fonctionnant sur Raspbian - le fichier contenant l'adresse de liaison est difficile à identifier. MariaDB a des informations pas très utiles sur le sujet.

j'ai utilisé

# sudo grep -R bind-address /etc 

pour localiser où se trouve la fichue chose.

J'ai également dû définir les privilèges et les hôtes dans le mysql comme tout le monde l'a souligné.

Et j'ai également eu du plaisir à ouvrir le port 3306 pour les connexions à distance à mon Raspberry Pi - enfin utilisé iptables-persistent .

Tout fonctionne très bien maintenant.


1

si vous avez plusieurs réseaux attachés à votre système d'exploitation, vous devez en spécifier un dans les bind-addres du fichier my.conf. un exemple:

[mysqld]
bind-address = 127.100.10.234

cette adresse IP provient d'une configuration ethX.


1
Veuillez ajouter plus de détails. Dans quel fichier ou cadre ce paramètre doit-il se produire? Veuillez être plus précis sur la configuration ethX.
BPS

1

Dans mon cas, le paramètre "bind-address" était le problème. Commenter ce paramètre my.cnfn'a pas aidé, car dans mon cas, mysql a défini la valeur par défaut sur 127.0.0.1 pour une raison quelconque.

Pour vérifier quel paramètre MySql utilise actuellement, ouvrez la ligne de commande sur votre boîte locale:

mysql -h localhost -u myname -pmypass mydb

Lisez le paramètre actuel:

Show variables where variable_name like "bind%"

Vous devriez voir 0.0.0.0 ici si vous souhaitez autoriser l'accès de tous les hôtes. Si ce n'est pas le cas, modifiez votre /etc/mysql/my.cnfadresse de liaison et définissez-la dans la section [mysqld]:

bind-address=0.0.0.0

Enfin, redémarrez votre serveur MySql pour récupérer le nouveau paramètre:

sudo service mysql restart

Réessayez et vérifiez si le nouveau paramètre a été sélectionné.


-2

mysql_update est ce dont vous avez besoin.

Je ne sais pas pourquoi quiconque suivrait les moyens les plus complexes de corriger ce problème, lorsque MySql a gracieusement construit un outil qui le fait déjà ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.