Dostęp root do MySQL ze wszystkich hostów


152

Zainstalowałem serwer MySQL na zdalnym komputerze Ubuntu. W tabeli rootdefiniujemy użytkownika w mysql.usernastępujący sposób:

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

Mam dostęp z użytkownikiem rootz tego samego interfejsu wiersza poleceń maszyny zdalnej przy użyciu standardowego mysqlklienta. Teraz chcę zezwolić na dostęp do roota z każdego hosta w Internecie , więc spróbowałem dodać następujący wiersz (jest to dokładny duplikat pierwszego wiersza z poprzedniego zrzutu, z wyjątkiem hostkolumny):

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

Ale mój klient na moim osobistym komputerze nadal mi mówi (zasłoniłem adres IP serwera):

Błąd SQL (2003): nie można połączyć się z serwerem MySQL na '46 .xxx '(10061)

Nie mogę stwierdzić, czy jest to błąd uwierzytelniania, czy błąd sieci. Na firewallu serwera włączyłem port 3306 / TCP dla 0.0.0.0/0 i to jest dla mnie ok ...


czy możesz telnetować się do maszyny na porcie 3306
mihaisimi

3
najprawdopodobniej demon MySQL nie nasłuchuje na 46.xxx, ale tylko na hoście lokalnym. Szukaj bind-addressw my.cnf
Maxim Krizhanovsky

1
Tak więc świat + pies ma teraz skrót twojego hasła roota, wiedzę, że root jest dostępny z dowolnego hosta w Internecie i pierwszy bajt twojego adresu IP. Myślisz, że nie jest to tylko mały kawałek dotyczące?
Eggyal

Odpowiedzi:


362

Proces ten składa się z dwóch etapów:

a) Przyznaj uprawnienia. Jako użytkownik root wykonaj następujące czynności, zastępując 'password'aktualne hasło roota:

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

b) powiąż ze wszystkimi adresami:

Najłatwiejszym sposobem jest wykomentowanie linii w my.cnfpliku:

#bind-address = 127.0.0.1 

i zrestartuj mysql

service mysql restart

Domyślnie wiąże się tylko z localhost, ale jeśli skomentujesz wiersz, będzie on wiązał się ze wszystkimi znalezionymi interfejsami. Skomentowanie wiersza jest równoważne z bind-address=*.

Aby sprawdzić, gdzie usługa mysql została powiązana, wykonaj jako root:

netstat -tupan | grep mysql

Aktualizacja dla Ubuntu 16:

Plik konfiguracyjny to (teraz)

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

(przynajmniej na standardowym Ubuntu 16)


5
Ok, problemem był adres wiążący. Dziękuję Ci. @Darhazer Też dziękuję :)
lorenzo-s

2
Aby sprawdzić aktualne dotacje: `` POKAŻ DOTACJE DLA 'root' @ '%';
robsch

5
Aby również zezwolić root @% na nadawanie uprawnień innym użytkownikom, natychmiast po kroku (a) wykonaj: PRZYZNANIE UŻYCIA NA *. * DO 'root' @ '%' Z OPCJĄ GRANT;
Caleb

1
Plik konfiguracyjny to (teraz) /etc/mysql/mysql.conf.d/mysqld.cnf (przynajmniej na standardowym Ubuntu 16)
jgp

2
Po prostu musiałem to zrobić, aby móc zdalnie połączyć się z serwerem:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Uruchom następujące zapytanie:

use mysql;

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

UWAGA: Nie zalecane do użytku produkcyjnego.


2
To nie jest idealne rozwiązanie. To może zadziałać. U mnie wystąpił błąd: ERROR 1062 (23000): zduplikowany wpis „% -root” dla klucza „PRIMARY”
Scriptlabs

2
@Scriptlabs, prawdopodobnie istnieje więcej niż jeden wpis w tabeli użytkowników z hostem „localhost”. I więcej niż jeden wiersz z katalogiem głównym, w tym root.localhost, root.127.0.0.1, root.:1. Dlatego lepiej jest dodać oddzielnego użytkownika niż aktualizować, dlatego odrzucam tę odpowiedź.
Mike Purcell

4
nie jest PRIVILEGES FLUSH; również potrzebne zaraz potem?
Nom1fan

1
to działa dla mnie. Spróbuj tego. update mysql.user set host='%' where user='root'
nur zazin


7

MYSQL 8.0 - otwórz klienta wiersza poleceń mysql
PRZYZNAJ WSZYSTKIE UPRAWNIENIA NA *. * TO 'root' @ 'localhost';
użyj mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Uruchom ponownie usługę mysql


4

MariaDB działająca na Raspbian - plik zawierający adres powiązania jest trudny do zlokalizowania. MariaDB ma kilka niezbyt pomocnych informacji na ten temat.

użyłem

# sudo grep -R bind-address /etc 

zlokalizować, gdzie jest to cholerstwo.

Musiałem także ustawić uprawnienia i hosty w mysql, jak wszyscy powyżej wskazali.

A także dobrze się bawiłem, otwierając port 3306 do zdalnych połączeń z moim Raspberry Pi - w końcu użyłem iptables-persistent .

Teraz wszystko działa świetnie.


1

jeśli masz wiele sieci podłączonych do twojego systemu operacyjnego, musisz określić jedną z tych sieci w bind-addres z pliku my.conf. przykład:

[mysqld]
bind-address = 127.100.10.234

ten adres IP pochodzi z konfiguracji ethX.


1
Dodaj więcej szczegółów. W jakim pliku lub strukturze musi się to odbywać? Podaj bardziej szczegółowe informacje o konfiguracji ethX.
BPS

1

W moim przypadku problemem było ustawienie „bind-address”. Komentując to ustawienie w my.cnftak nie pomaga, bo w moim przypadku mysql ustawić domyślną do 127.0.0.1 z jakiegoś powodu.

Aby sprawdzić, jakiego ustawienia obecnie używa MySql, otwórz wiersz poleceń w swoim lokalnym oknie:

mysql -h localhost -u myname -pmypass mydb

Odczytaj aktualne ustawienie:

Show variables where variable_name like "bind%"

Powinieneś zobaczyć 0.0.0.0 tutaj, jeśli chcesz zezwolić na dostęp ze wszystkich hostów. Jeśli tak nie jest, edytuj swój /etc/mysql/my.cnfadres wiązania i ustaw go w sekcji [mysqld]:

bind-address=0.0.0.0

Na koniec zrestartuj serwer MySql, aby wybrać nowe ustawienie:

sudo service mysql restart

Spróbuj ponownie i sprawdź, czy wybrano nowe ustawienie.


-2

mysql_update jest tym, czego potrzebujesz.

Nie wiem, dlaczego ktokolwiek miałby stosować bardziej złożone sposoby naprawienia tego problemu, skoro MySql łaskawie zbudował narzędzie, które już to robi ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.