
У меня есть небольшой скрипт на Python для сбора оценок домашних заданий и онлайн-занятий студентов из таблицы allstudentsAnswers20BE.
Это прекрасно работает на моей старой странице на общем веб-хостинге.
На новом облачном сервере Ubuntu 20.04 я получаю отказ в подключении. У меня нет опыта работы с облачным сервером.
Я разрешил порты 33060 и 3306 в UFW
Мой домашний IP не фиксированный.
Когда я запускаю свой скрипт Python, я получаю эту ошибку при попытке подключения к облачному серверу
pymysql.err.OperationalError: (1130, «183.206.16.30' не разрешено подключаться к этому серверу MySQL»)
netstat сообщает, что mysqld прослушивает порты 33060 и 3306, поэтому я разрешил оба порта в брандмауэре ufw
Подключившись к облачному серверу по ssh, я выполнил:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Я изменил строку bind-address на 0.0.0.0 (я также пробовал *)
Я перезапустил mysql: sudo systemctl restart mysql
Должно быть, есть что-то еще, что нужно настроить на стороне сервера.
Пожалуйста, дайте какие-нибудь советы, что это может быть, мне очень нужно, чтобы это сработало.
Я также получил эту информацию (предположим, что мой облачный IP-адрес — 123.456.789.123):
pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
Подключение к порту 123.456.789.123 3306 [tcp/mysql] успешно установлено! pedro@ebs-105422:~$
Означает ли это, что mysqld слушает на 3530?? Или это PID mysqld??
pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* СЛУШАТЬ 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* СЛУШАТЬ 3530/mysqld
pedro@ebs-105422:~$
Ниже приведено из MySQL на сервере, подтверждающее порт 3306
mysql> показать переменные, где variable_name in ('hostname','port');
+--------------+------------+
| Variable_name | Value |
+--------------+------------+
| hostname | ebs-105422 |
| port | 3306 | +--------------+------------+
2 строки в наборе (0,01 сек)mysql>
решение1
Я понял, этот ответ просто для того, чтобы помочь всем, у кого может быть та же проблема. Этот способ, вероятно, не так безопасен, с открытым 3306, но а) у меня только домашнее задание б) вам все равно нужны имя пользователя и пароль.
Когда вы создаете пользователя в MySQL, это выглядит примерно так, даже если вы делаете это через SSH на сервере:
СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ 'peter'@'localhost' С ИДЕНТИФИКАЦИЕЙ 'password';
ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА some_db.* ПОЛЬЗОВАТЕЛЮ 'peter'@'localhost';
Если вам нужен удаленный доступ, вам необходимо изменить данные пользователя (или создать нового пользователя):
ПЕРЕИМЕНОВАТЬ ПОЛЬЗОВАТЕЛЯ 'peter'@'localhost' В 'peter'@'%';
ПРЕДОСТАВИТЬ ВСЕ ПРАВА НА somedb.* В 'peter'@'%';
% здесь, по-видимому, представляет собой любой ip
Затем также через ssh на сервере:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
найдите строку, которая имеет
адрес привязки = 127.0.0.1
измените это на
адрес привязки = 0.0.0.0
ctrl X для выхода nano nano спросит, хотите ли вы сохранить, нажмите y, затем Enter, чтобы сохранить в том же месте, где вы открыли /etc/mysql/mysql.conf.d/mysqld.cnf
Затем (на сервере):
sudo systemctl перезапустите mysql
После этого мой Python нормально заработал из оболочки Idle:
def mysqlRemoteAttn(clas):
# To connect remote MySQL database
conn = pymysql.connect(
host='123.456.789.123',
port=3306,
user='myusername',
password = 'mypassword',
db='allstudentsdb',
)
cur = conn.cursor()
sql = f"SELECT studentnr, attn_this_week FROM allstudents{clas}"
cur.execute(sql)
output = cur.fetchall()
# To close the connection
conn.close()
return output
# get the attendance from the webpage MySQL
results = mysqlRemoteAttn(clas)