
Eu tenho um pequeno script Python para coletar as pontuações dos trabalhos de casa e das aulas on-line dos alunos na tabela allstudentsAnswers20BE.
Isso funciona muito bem na minha antiga página de hospedagem compartilhada.
No novo servidor em nuvem Ubuntu 20.04, a conexão foi recusada. Não tenho experiência em executar um servidor em nuvem.
Permiti as portas 33060 e 3306 no UFW
Meu ip está em casa não está consertado.
Quando executo meu script Python, recebo este erro ao tentar me conectar ao servidor em nuvem
pymysql.err.OperationalError: (1130, "183.206.16.30' não tem permissão para se conectar a este servidor MySQL")
netstat diz que o mysqld está escutando em 33060 e 3306, então permiti ambos no firewall ufw
Conectando-me ao servidor em nuvem via ssh, executei:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Alterei a linha bind-address para 0.0.0.0 (também tentei *)
Eu reiniciei o mysql: sudo systemctl restart mysql
Deve haver algo mais que precisa ser configurado no lado do servidor.
Alguma dica sobre o que pode ser, por favor, eu realmente preciso que isso funcione.
Também recebi esta informação (suponha que meu IP da nuvem seja 123.456.789.123):
pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306
Conexão à porta 123.456.789.123 3306 [tcp/mysql] bem sucedida! pedro@ebs-105422:~$
Isso significa que o mysqld está escutando em 3530? Ou esse é o PID do mysqld?
pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* ESCUTE 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* ESCUTE 3530/mysqld
pedro@ebs-105422:~$
Abaixo está do mysql no servidor, confirmando a porta 3306
mysql> mostra variáveis onde nome_da_variável está ('hostname','port');
+---------------+------------+
| Nome_variável | Valor |
+---------------+------------+
| nome do host | ebs-105422 |
| porto | 3306 | +---------------+------------+
2 linhas no conjunto (0,01 seg)mysql>
Responder1
Eu descobri, essa resposta é apenas para ajudar quem pode ter o mesmo problema. Este caminho provavelmente não é tão seguro, com 3306 aberto, mas a) só tenho lição de casa b) você ainda precisa do nome de usuário e senha.
Quando você cria um usuário no mysql fica mais ou menos assim, também quando você faz isso via ssh no servidor:
CRIAR USUÁRIO 'peter'@'localhost' IDENTIFICADO POR 'senha';
CONCEDER TODOS OS PRIVILÉGIOS EM some_db.* TO 'peter'@'localhost';
Se desejar acesso remoto, você precisa alterar os dados do usuário (ou criar um novo usuário):
RENOMEAR USUÁRIO 'peter'@'localhost' PARA 'peter'@'%';
GRANT ALL ON somedb.* TO 'peter'@'%';
% aqui aparentemente representa qualquer ip
Depois também via ssh no servidor:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
encontre a linha que tem
endereço de ligação = 127.0.0.1
mude isso para
endereço de ligação = 0.0.0.0
ctrl X para sair do nano nano pergunta se você deseja salvar, pressione y e digite para salvar no mesmo lugar que você abriu /etc/mysql/mysql.conf.d/mysqld.cnf
Então (no servidor):
sudo systemctl reiniciar mysql
Depois disso, meu Python funcionou bem no shell 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)