MySQL-Root-Zugriff von allen Hosts


152

Ich habe den MySQL-Server auf einem Remote-Ubuntu-Computer installiert. Der rootBenutzer wird in der mysql.userTabelle folgendermaßen definiert :

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

Ich kann mit dem Benutzer rootüber dieselbe Befehlszeilenschnittstelle des Remotecomputers mit dem Standardclient zugreifen mysql. Jetzt möchte ich Root-Zugriff von jedem Host im Internet zulassen , daher habe ich versucht, die folgende Zeile hinzuzufügen (es ist ein genaues Duplikat der ersten Zeile aus dem vorherigen Speicherauszug, mit Ausnahme der hostSpalte):

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

Aber mein Client auf meinem PC sagt mir weiterhin (ich habe die Server-IP verdeckt):

SQL-Fehler (2003): Es kann keine Verbindung zum MySQL-Server unter '46 .xxx '(10061) hergestellt werden.

Ich kann nicht sagen, ob es sich um einen Authentifizierungsfehler oder einen Netzwerkfehler handelt. Auf der Server-Firewall habe ich Port 3306 / TCP für 0.0.0.0/0 aktiviert , und das ist für mich in Ordnung ...



3
höchstwahrscheinlich hört der MySQL-Daemon nicht auf 46.xxx, sondern nur auf localhost. Suchen Sie bind-addressin my.cnf
Maxim Krizhanovsky

1
Die Welt + Hund hat jetzt den Hash Ihres Root-Passworts, das Wissen, dass Root von jedem Host im Internet aus zugänglich ist, und das erste Byte Ihrer IP-Adresse. Sie denken nicht, dass dies nur ein kleines bisschen betrifft?
Eggyal

Antworten:


362

Es gibt zwei Schritte in diesem Prozess:

a) Gewähren Sie Privilegien. Führen Sie als Root-Benutzer Folgendes aus, indem Sie 'password'Ihr aktuelles Root-Passwort ersetzen :

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

b) an alle Adressen binden:

Am einfachsten ist es , die Zeile in Ihrer my.cnfDatei zu kommentieren :

#bind-address = 127.0.0.1 

und starte mysql neu

service mysql restart

Standardmäßig wird es nur an localhost gebunden. Wenn Sie jedoch die Zeile kommentieren, wird es an alle gefundenen Schnittstellen gebunden. Das Auskommentieren der Zeile entspricht bind-address=*.

Um zu überprüfen, wo der MySQL-Dienst gebunden ist, führen Sie ihn als root aus:

netstat -tupan | grep mysql

Update für Ubuntu 16:

Konfigurationsdatei ist (jetzt)

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

(zumindest unter Standard Ubuntu 16)


5
Ok, das Problem war die Bindungsadresse. Danke dir. @ Darhazer Danke auch :)
Lorenzo-s

2
So fragen Sie aktuelle Zuschüsse ab: `SHAN GRANTS FOR 'root' @ '%';
Robsch

5
Damit root @% auch anderen Benutzern unmittelbar nach Schritt (a) Berechtigungen erteilen kann: GRANT USAGE ON *. * TO 'root' @ '%' WITH GRANT OPTION;
Caleb

1
Konfigurationsdatei ist (jetzt) ​​/etc/mysql/mysql.conf.d/mysqld.cnf (zumindest unter Standard-Ubuntu 16)
jgp

2
Ich musste dies nur tun, um eine Remote-Verbindung zum Server herstellen zu können:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Führen Sie die folgende Abfrage aus:

use mysql;

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

HINWEIS: Nicht für die Produktion empfohlen.


2
Dies ist nicht die perfekte Lösung. Es kann funktionieren. Für mich ist ein Fehler aufgetreten: FEHLER 1062 (23000): Doppelter Eintrag '% -root' für Schlüssel 'PRIMARY'
Scriptlabs

2
@Scriptlabs, wahrscheinlich gibt es mehr als einen Eintrag in der Benutzertabelle mit einem Host von 'localhost'. Und mehr als eine Zeile mit root, einschließlich root.localhost, root.127.0.0.1, root.::1. Sie sollten also lieber einen separaten Benutzer hinzufügen als aktualisieren, weshalb ich diese Antwort ablehne.
Mike Purcell

4
ist nicht FLUSH PRIVILEGES; auch gleich danach notwendig?
Nom1fan

1
das funktioniert bei mir. Versuche dies. update mysql.user set host='%' where user='root'
Nur Zazin

7

Manchmal

Bindungsadresse = 127.0.0.1

sollte sein

Bindungsadresse = *


7

MYSQL 8.0 - Öffnen Sie den MySQL-Befehlszeilenclient.
GEWÄHREN SIE ALLE PRIVILEGIEN AUF *. * TO 'root' @ 'localhost';
benutze mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Starten Sie den MySQL-Dienst neu


4

MariaDB läuft auf Raspbian - die Datei mit der Bindeadresse ist schwer zu lokalisieren. MariaDB hat einige nicht sehr hilfreiche Informationen zu diesem Thema.

ich benutzte

# sudo grep -R bind-address /etc 

um herauszufinden, wo das verdammte Ding ist.

Ich musste auch die Privilegien und Hosts in der MySQL festlegen, wie alle oben genannten.

Und hatte auch Spaß daran, den 3306-Port für Remote-Verbindungen zu meinem Raspberry Pi zu öffnen - endlich verwendet iptables-persistent .

Alles funktioniert jetzt großartig.


1

Wenn an Ihr Betriebssystem viele Netzwerke angeschlossen sind, müssen Sie eines dieser Netzwerke in den Bind-Adressen der Datei my.conf angeben. ein Beispiel:

[mysqld]
bind-address = 127.100.10.234

Diese IP stammt aus einer ethX-Konfiguration.


1
Bitte fügen Sie weitere Details hinzu. In welcher Datei oder in welchem ​​Framework muss diese Einstellung vorgenommen werden? Bitte geben Sie die ethX-Konfiguration genauer an.
BPS

1

In meinem Fall war die Einstellung "Bindungsadresse" das Problem. Das Kommentieren dieser Einstellung in my.cnfhat nicht geholfen, da mysql in meinem Fall aus irgendeinem Grund den Standardwert auf 127.0.0.1 gesetzt hat.

Öffnen Sie die Befehlszeile in Ihrer lokalen Box, um zu überprüfen, welche Einstellung MySql derzeit verwendet:

mysql -h localhost -u myname -pmypass mydb

Lesen Sie die aktuelle Einstellung vor:

Show variables where variable_name like "bind%"

Hier sollte 0.0.0.0 angezeigt werden, wenn Sie den Zugriff von allen Hosts zulassen möchten. Ist dies nicht der Fall, bearbeiten Sie Ihre /etc/mysql/my.cnfund legen Sie die Bindungsadresse im Abschnitt [mysqld] fest:

bind-address=0.0.0.0

Starten Sie schließlich Ihren MySQL-Server neu, um die neue Einstellung zu übernehmen:

sudo service mysql restart

Versuchen Sie es erneut und prüfen Sie, ob die neue Einstellung übernommen wurde.


-2

mysql_update ist was du brauchst.

Ich weiß nicht, warum jemand die komplexeren Methoden zur Behebung dieses Problems befolgen würde, wenn MySql freundlicherweise ein Tool erstellt hat, das dies bereits tut ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.