В течение многих месяцев я соединялся с экземпляром MySQL, работающим на нашем локальном тестовом сервере через туннель SSH без любых проблем. Внезапно, хотя, без изменений я могу думать, сервер начал отклонять журнал в попытке от Продолжения Pro с ошибкой:
Невозможно подключиться к хостом 127.0.0.1, потому что доступ был запрещен.
Перепроверьте свое имя пользователя и пароль и удостоверьтесь, что доступ от Вашего текущего местоположения разрешен.
MySQL сказан: Доступ запрещен для пользователя 'базируется' 'localhost' (использование пароля: ДА)
Я могу войти в систему от терминала при прямом соединении с сервером через SSH, просто не через туннель SSH. Проблема не характерна для Продолжения Pro или просто меня также, я получаю ту же ошибку при соединении через MySQL Workbench также, как и другие в офисе. Я изменил пароль с mysqladmin
только для пользы исправности, это - определенно не проблема.
Когда я начал изучать его больше, я заметил, что ошибка сообщала о сервере как "localhost", вместо "127.0.0.1", который я ввел в Продолжение Pro. Друг предположил, что это - вероятно, просто плохая обработка ошибок, но это кажется странным, учитывая значительную разницу между localhost и 127.0.0.1 в MySQL.
В попытке обойти туннелирующую проблему, я предоставил доступ для укоренения %, так, чтобы я мог соединиться непосредственно. Это работает по большей части, я могу просмотреть данные таблицы, создать новые базы данных и т.д. Единственная проблема состоит в том, когда я приезжаю для создания пользователей, я получаю ошибку:
Доступ запрещен для пользователя 'базируется' '%' (использующий пароль: ДА)
Странно пользователь на самом деле создается, я думаю, что это - просто проблема с предоставлением. Снова, хотя, от терминала я могу сделать что-либо при входе в систему как корень.
Кто-либо может помочь пролить некоторый свет на то, почему туннельные соединения и (вероятно) допускают, что команды получают ошибку доступа запрещен?
Поскольку ссылочный MySQ является версией 5.6.16 с главным образом настройками по умолчанию, установленными через Домашнее пиво на машине Сервера Mac OS X.
Обновление
Вот список хостов, на которых корень является в настоящее время предоставляемым доступом:
mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host | user |
+----------------+------+
| % | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | root |
+----------------+------+
4 rows in set (0.00 sec)
Насколько я понимаю первая строка (" % ") должна действительно сделать другие избыточными?
Обновление 2
Устраненный проблема предоставления; корню пользователь % не предоставили все полномочия с дополнительным with grant option
на конце, таким образом, это могло сделать все кроме предоставления. Все еще любил бы знать, почему туннели SSH отклоняются все же.
В MySQL ключевое слово localhost
зарезервировано для соединения с использованием сокета MySQL, и вы должны использовать ip-адрес 127.0.0.1
для TCP-соединений с сетевым портом MySQL на 127.0.0.1. Это означает, что оба сервера должны предоставлять пользователям привилегии из специфических 127.0.0.1
, и клиентов должны использовать -h 127.0.0.1
для прохождения через туннель вместо подключения к локальному сокету.
Чтобы разрешить вам доступ, используя переадресацию SSH-порта, вам нужно что-то вроде:
GRANT SELECT ON *.* TO user@`127.0.0.1`
, а затем запустить
FLUSH PRIVILEGES;
и, возможно,
FLUSH QUERY CACHE;
Если это все еще не работает, перезапустите процесс сервера.
В сообщениях об ошибках 127.0.0.1 после обратного DNS поиска переводится на localhost
, что затрудняет отладку.
Как описывает manual:
В Unix, MySQL программы обращаются с именем хоста localhost специально, таким образом, что это, скорее всего, отличается от того, что вы ожидаете от других программ, работающих в сети. Для подключения к localhost, MySQL программы пытаются подключиться к локальному серверу, используя файл сокета Unix. Это происходит, даже если для указания номера порта задан параметр -
-port
или-P
. Чтобы убедиться, что клиент устанавливает TCP/IP соединение с локальным сервером, используйте-host
или-h
, чтобы указать значение имени хоста127.0.0.1
, или IP-адрес или имя локального сервера. Вы также можете явно указать протокол соединения, даже для локального хоста, используя опцию--protocol=TCP
. Например:
shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP
- опция
--protocol
позволяет установить определенный тип соединения, даже если другие опции обычно устанавливаются по умолчанию для какого-то другого протокола.
Я уже видел в прошлом с ssh-тюнелями, что есть разница между Grant all to "localhost" и Grant all to "127.0.0.1", так что попробуйте Grant all to "127.0.0.1" вместо этого или в дополнение к вашему гранту "localhost".
.Вместо того, чтобы использовать Sequel для создания туннеля, что вы сами создаете туннель ?
ssh -Cc blowfish -Nf -vv -L3306:localhost:3306 sshuser@domain
Затем соединитесь с Sequel на 127.0.0.1:3306. Ты можешь подключиться? Появляется ли что-нибудь на вашем терминале (или в журналах ssh-клиентов)?
.