надати віддалений доступ до бази даних MySQL з будь-якої IP-адреси


280

Мені відомо про цю команду:

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

Але тоді це дозволяє лише мені надати певну IP-адресу для доступу до цієї віддаленої бази даних MySQL. Що робити, якщо я хочу, щоб будь-який віддалений хост міг отримати доступ до цієї бази даних MySQL? Як це зробити? В основному я оприлюднюю цю базу даних, щоб кожен мав доступ до неї.


1
Перш ніж це зробити, врахуйте наслідки для безпеки
e18r

7
не кожна система є виробничою системою. деякі люди потребують цього для розвитку.
Конрад Джонс

Відповіді:


272
TO 'user'@'%'

% - це підстановка - ви також можете робити '%.domain.com'або '%.123.123.123'і такі речі, якщо вам потрібно.


@kristopolous Є багато речей, які можуть це спричинити. Ця команда стосується віддаленого доступу (дві різні машини). Якщо це не те, що ви робите, це не правильна команда. Вам ще потрібен правильний пароль та інші речі.
Аріель

11
Ви повинні використовувати "привілеї флеш;" щоб зміни вступили в силу
Дідьє Сампаоло

Підступ при підключенні до екземпляра db, який працює на тому самому екземплярі ОС (наприклад, вашій розроблювальній машині), полягає в передачі -h my_machine_nameпараметра. Це хитрість клієнта ідентифікувати вас як 'user'@my_machine_name.example.com, а не 'user'@localhost. Таким чином, вам не потрібно створювати та підтримувати подвійні облікові записи та дотації як для localhostдоступу до мережі. І, звичайно ж , бути впевнений mysqldпов'язаний 0.0.0.0проти 127.0.0.1.
Charlie

173

Увімкнути віддалений доступ (надайте) додому / підручники / Mysql / Увімкніть віддалений доступ (Грант) Якщо ви спробуєте підключитися до свого сервера mysql з віддаленої машини та натрапите на помилку, як показано нижче, ця стаття для вас.

ПОМИЛКА 1130 (HY000): Хост '1.2.3.4' заборонено підключатися до цього сервера MySQL

Змінити конфігурацію mysql

Почніть з редагування файлу конфігурації mysql

vim /etc/mysql/my.cnf

Прокоментуйте наступні рядки.

#bind-address           = 127.0.0.1
#skip-networking

Якщо ви не знайдете лінію пропуску мережі, додайте її та коментуйте її.

Перезавантажте сервер mysql.

~ /etc/init.d/mysql restart

Змінити привілей GRANT

Ви можете бути здивовані, побачивши, що навіть після вищезгаданих змін ви не отримуєте віддалений доступ або отримуєте доступ, але не маєте можливості до всіх баз даних.

За замовчуванням користувальницьке ім'я користувача та пароль mysql мають доступ до локального сервера mysql. Тому потрібно оновити привілей.

Виконайте наведену нижче команду для доступу з усіх машин. (Замініть USERNAMEі PASSWORDза допомогою своїх облікових даних.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Виконайте команду, як показано нижче, щоб отримати доступ з певного IP-адреси. (Замініть USERNAMEі PASSWORDза допомогою своїх облікових даних.)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Ви можете замінити 1.2.3.4 своїм IP-адресою. Ви можете виконувати над командою багато разів, щоб отримати доступ до GRANT з декількох IP-адрес.

Ви також можете вказати окремий USERNAMEта PASSWORDвіддалений доступ.

Ви можете перевірити кінцевий результат:

SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

Нарешті, вам також може знадобитися запустити:

mysql> FLUSH PRIVILEGES;

Підключення до тесту

З терміналу / командного рядка:

mysql -h HOST -u USERNAME -pPASSWORD

Якщо у вас є оболонка mysql, не забудьте запустити бази даних show; щоб перевірити, чи маєте ви праві привілеї віддалених машин.

Бонусний рада: Скасуйте доступ

Якщо ви випадково надаєте доступ користувачеві, тоді краще скасувати варіант скасування.

Далі буде скасовано всі параметри для USERNAME з усіх машин:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

Якщо після запуску команди REVOKE ви побачите привілей USAGE, його штраф. Це так добре, як взагалі ніяких пільг. Я не впевнений, чи можна це відкликати.


7
Зауважте, що мені довелося змінити /etc/mysql/mysql.conf.d/mysqld.cnfфайл, а /etc/mysql/my.cnfне коментувати bind-addressчастину. #skip-networkingЛінія відсутня , і не повинна бути ніякого ефекту додавання і коментування лінії.
Pawan

1
На MariaDB 10.1.26 файл конфігурації/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz

Якщо ви зробили все вищезазначене і все ще не можете підключитися, перевірте настройки брандмауера, можливо, блокує порт 3306або той порт, який ви встановили
avn

37

Якщо припустити, що вищезазначений крок виконаний, і порт 3306 MySql вільний, щоб отримати доступ до нього дистанційно; Не забудьте прив’язати загальнодоступну ip адресу у файлі конфігурації mysql.

Наприклад, на моєму сервері ubuntu:

#nano /etc/mysql/my.cnf

У файлі знайдіть блок розділу [mysqld] та додайте нову адресу зв’язування, у цьому прикладі це 192.168.0.116. Це виглядало б приблизно так

......    
.....    
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1    
bind-address        = 192.168.0.116

.....    
......

ви можете видалити прив'язку localhost (127.0.0.1), якщо ви вирішите, але тоді вам потрібно спеціально вказати IP-адресу для доступу до сервера на локальній машині.

Тоді останнім кроком є ​​перезапуск сервера MySql (в ubuntu)

stop mysql

start mysql

або #/etc/init.d/mysql restartдля інших систем

Тепер до бази даних MySQL можна отримати доступ дистанційно:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reloadмає вистачити
Лоренц Ло Зауер

Я просто це зробив і не міг віддалено підключитися до сервера mysql. Потім я спробував прокоментувати зв'язування адрес, і це спрацювало. Я також спробував увійти на сервер за допомогою mysql -u <user> -p, не вказуючи хост, і він спрацював, тож видається, що "ви можете видалити прив'язку localhost (127.0.0.1), якщо захочете, але тоді вам доведеться спеціально надати IP-адресу для доступу до сервера на локальній машині. " невірно. (Ubuntu 12.04 LTS сервер MySQL Вер 14.14 Distrib 5.5.34)
Programster

5
bind-addressДиректива визначає IP - адреса , який MySQL сервер прослуховує; не IP-адреси, від яких сервер приймає з'єднання.
GoZoner

1
Після виконання кожного кроку він не працює. Я отримую помилку, коментуючи bind-addressабо адресу localhost, або віддалений хост. mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
baermathias

Чи можна надати адресу типу abc.abc:1234 замість 192.168.0.116?
bielas

26

Для всіх, хто зіткнувся з цим, ось як я мав надавати пільги, сподіваюся, що це комусь допоможе

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

Як зазначається %, це підстановка, і це дозволить будь-якій IP-адресі підключитися до вашої бази даних. Я припускаю тут, що під час підключення ви матимете ім’я користувача root(який є дефолтом). Введіть корінний пароль, і вам добре піти. Зауважте, що у мене немає жодних лапок ( ') навколо кореня користувача.


Чому важливо видаляти єдині лапки у користувача? Чому це відрізняється від інших відповідей (і посібника)?
DMCoding

26

Налаштування змін файлів необхідні для включення з'єднань через localhost.

Щоб підключитися через віддалені IP-адреси, увійдіть як "root" користувач та запустіть наведені нижче запити в mysql.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Це створить нового користувача, який доступний як у localhost, так і з віддалених IP-адрес.

Також прокоментуйте рядок нижче зі свого файлу my.cnf, який знаходиться в /etc/mysql/my.cnf

bind-address = 127.0.0.1

Перезавантажте MySQL за допомогою

sudo service mysql restart

Тепер ви повинні мати можливість віддалено підключитися до свого mysql.


2
Це не відповідає на запитання.
Чарріс

1
@ChristopheHarris Чому ти так відчуваєш? Відповідь чітко дає покрокову інструкцію про те, як створити нового користувача в MySQL, який дозволяє як локальний, так і віддалений доступ до БД за допомогою цього користувача. Чи можете ви плесай пояснити?
harishannam

1
Не працює для мене. Все-таки є однакова помилка. Незалежно від того, спробую я його з root або новим користувачем: Не вдається підключитися до сервера MySQL на "xxx.xxx.xxx.xxx" ([Errno 61] Підключення відмовлено)
baermathias

21

Використовуйте цю команду:

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

Тоді:

FLUSH PRIVILEGES; 

Потім прокоментуйте наступний рядок у файлі "/etc/mysql/mysql.conf.d/mysqld.cnf" (обов'язково!):

bind-address = 127.0.0.1 

Працює для мене!


Дуже хороший. Важлива грант. Якщо ні, то багато помилок для запитів, таких якyour-password-does-not-satisfy-the-current-policy-requirements
Алехандро Тейшейра Муньос

21

Щоб мати можливість з'єднатися зі своїм користувачем з будь-якої IP-адреси, виконайте наступне:

Дозволити серверу mysql приймати віддалені з'єднання. Для цього відкритого файлу mysqld.conf:

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

Шукайте рядок, починаючи з "bind-address", і встановіть значення 0,0,0,0

bind-address                    = 0.0.0.0

і нарешті збережіть файл.

Примітка: Якщо ви працюєте з MySQL 8+, bind-addressдиректива не буде у mysqld.cnfфайлі за замовчуванням. У цьому випадку додайте директиву внизу файлу /etc/mysql/mysql.conf.d/mysqld.cnf.

Тепер перезапустіть сервер mysql systemdабо використовуйте стару serviceкоманду або використовуйте її . Це залежить від вашої операційної системи:

sudo systemctl restart mysql # for ubuntu    
sudo systemctl restart mysqld.service # for debian

Нарешті, сервер mysql тепер може приймати віддалені з'єднання.

Тепер нам потрібно створити користувача та надати йому дозвіл, щоб ми могли мати дистанційний вхід із цим користувачем.

Підключіться до бази даних MySQL як root, або будь-який інший користувач з привілеєм root.

mysql -u root -p

тепер створіть потрібного користувача як у localhost, так і у%% wildcard та надайте дозволи на всі БД як такі.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

Тоді,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

І, нарешті, не забудьте прибрати пільги

FLUSH PRIVILEGES;

Примітка. Якщо ви налаштували брандмауер на сервері бази даних, вам також знадобиться відкрити порт 3306за замовчуванням порту MySQL, щоб дозволити трафік на MySQL.

Сподіваюся, це допомагає;)


2
sudo systemctl перезапуск mysqld.service призначений для debian, мені довелося використовувати sudo systemctl перезавантаження mysql.service призначено для ubuntu
ani0904071

Я оновив свою відповідь і додав команду перезавантаження mysql для обох дистрибутивів. дякую @ ani0904071
Імтіаз Шакіл

17

Виконайте наступне:

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';     
mysql> FLUSH PRIVILEGES;     
mysql> exit

Потім спробуйте підключитись із вказаної вами IP-адреси:

mysql -h address-of-remove-server -u root -p   

Ви повинні мати можливість підключитися.


15

Ви можете передати проблему MariaDB за допомогою цієї команди :

Примітка:

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'mysql root password';

%являє собою підстановку. У цьому випадку воно посилається на всі IP-адреси.


3
у mysql, що вам потрібно зробити, це (1) .change my.cnf content (2) .grant віддалений користувач (3) мати справу з вашим брандмауером для прослуховування порту 3306.
未来 陆家嘴 顶尖 的 投资 人

Ти врятував мені день. Вдячний за це!
Алметт


7

Для віддаленого доступу до бази даних Mysql server 8:

CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

5
  • ЗАПУСК MYSQL за допомогою користувача адміністратора
    • mysql -u admin-user -p (Введіть ПАРОЛЬ НА СУМКУ)
  • Створіть нового користувача:
    • СТВОРИТИ КОРИСТУВАЧ "newuser" @ "%" ІДЕНТИФІКОВАНО "паролем"; (% -> anyhost)
  • Надання пільг:
    • ВИДАЛИТИ ВИБІР, ВИДАЛИТИ, ВСТАВИТИ, ОНОВЛЮВАТИСЯ НА db_name. * ДО 'newuser' @ '%';
    • ПРИГОТОВЛЕННЯ;

Якщо ви використовуєте екземпляр EC2, не забудьте додати вхідні правила в групу безпеки за допомогою MYSQL / Aurura.


5

Редагувати файл:

/etc/mysql/percona-server.cnf

Додайте нижче код у файл.

[mysqld] bind-address = 0.0.0.0

Створіть користувача для віддаленого доступу.

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to snippetbucketdotcom@'%' IDENTIFIED BY 'tejastank';   
mysql> FLUSH PRIVILEGES;    
mysql> exit

Всі сервери Linux працюють,

Для MSWin c: \ Знайдіть місце інсаляції \ шлях до файлу


[mysqld] потрібно додати у файл, інакше не працювати належним чином
Tejas Tank

3

Просто створіть користувача в такій базі даних, як

GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'%' IDENTIFIED BY '<password>'

Потім переходьте до

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfі змінити рядок bind-address = 127.0.0.1наbind-address = 0.0.0.0

Після цього ви можете підключитися до цієї бази даних з будь-якої IP-адреси.


3

Відкрийте mysql consoleта виконайте таку команду (введіть ім'я бази даних, ім’я користувача та пароль):

ВИДАЛУЙТЕ ВСІ НА ВІДНІМАНІДУ ваших даних. * ДО адміністратора @ '%' ІДЕНТИФІКОВАНО "ВашимRootPassword";

Потім виконайте:

ПРИГОТОВЛЕННЯ;

Відкрийте командний рядок і відкрийте файл /etc/mysql/mysql.conf.d/mysqld.cnfза допомогою будь-якого редактора root privileges.

Наприклад:

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

Потім прокоментуйте наступний рядок:

bind-address = 127.0.0.1

Перезапустіть mysql, щоб відобразити зміни за допомогою команди:

sudo service mysql restart

Насолоджуйтесь;)


2

Вам потрібно змінити конфігураційний файл mysql:

Почніть з редагування файлу конфігурації mysql

vim /etc/mysql/my.cnf

додати:

bind-address = 0.0.0.0

0

На панелях веб-сайтів, таких як cPanel, ви можете додати єдиний %(знак відсотка) дозволених імен хостів для доступу до вашої бази даних MySQL.

Додавши єдиний, %ви можете отримати доступ до вашої бази даних з будь-якого IP або веб-сайту, навіть із настільних додатків.


будь ласка, не посилайтеся на таку річ, як cPanel, коли представлений прямий запит, це ніколи не покаже робочий результат для будь-кого іншого
Tobias Hagenbeek

@TobiasHagenbeek Дякую за відгук. Цей метод / трюк не придуманий мною (поширений в Інтернеті). Але я один із тестерів цього методу, і я виявив, що це найпростіший і працюючий метод, тому я його розмістив тут. Я знаю, що в цьому методі є деякі ризики безпеки, якими можна знехтувати.
Мухаммед Сакіб

0

Наприклад, у моєму CentOS

sudo gedit /etc/mysql/my.cnf

прокоментуйте наступні рядки

# bind-address = 127.0.0.1

тоді

sudo сервіс mysqld перезапуск


0

Якщо ви хочете надати віддалений доступ до вашої бази даних з будь-якої IP-адреси, запустіть команду mysql і після цього запустіть наступну команду.

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

0

те, що працювало на Ubuntu, - це надання всім привілеям користувачеві:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;

і встановлення адреси прив'язки в /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

потім перезапустіть демон mysql:

service mysql restart

-7

Ви можете відключити всю безпеку, відредагувавши /etc/my.cnf:

skip-grant-tables

це видаляє всі вимоги до пароля
kristopolous

5
Зауважте, що цю опцію не дозволено включати у виробничих умовах, оскільки це дозволяє кожному підключитися без пароля!
AStopher

проте це ідеально підходить для середовища розробників
DMCoding

Це дозволяє людям зламати вашу базу даних без використання пароля.
MilkyWay90

@DanielJames навіть для середовища розробки це жахлива ідея
Драгас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.