我需要做什么才能允许远程访问 Unbuntu 20.04 服务器上的 MySQL?

我需要做什么才能允许远程访问 Unbuntu 20.04 服务器上的 MySQL?

我有一个小 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)

相关内容