我有一个小 Python 脚本,用于从表 allstudentsAnswers20BE 中收集学生的家庭作业和在线课程作业分数。
这在我的旧共享网络托管网页上运行良好。
在新的 Ubuntu 20.04 云服务器上,我遇到了连接被拒绝的情况。我没有运行云服务器的经验。
我在 UFW 中允许了端口 33060 和 3306
我的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?或者这是 mysqld 的 PID?
pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* LISTEN 3530/mysqld
pedro@ebs-105422:~$
以下是服务器上的mysql,确认端口3306
mysql>显示变量,其中变量名位于('hostname','port')中;
+---------------+------------+
| 变量名 | 值 |
+---------------+------------+
| 主机名 | ebs-105422 |
| 端口 | 3306 | +---------------+------------+
集合中的 2 行(0.01 秒)mysql>
答案1
我明白了,这个答案只是为了帮助任何可能遇到同样问题的人。这种方式可能不太安全,3306 是开放的,但是 a) 我只有家庭作业 b) 你仍然需要用户名和密码。
当你在 mysql 上创建一个用户时,它看起来像这样,当你通过服务器上的 ssh 执行此操作时也是如此:
创建用户'peter'@'localhost',由'密码'标识;
授予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 shell 中运行良好:
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)