如何用Python 3.10从Linux机器连接NAS上的MariaDB数据库?
解决局域网内Ubuntu通过Python连接Synology NAS MariaDB的问题
你遇到的核心问题是:通过SSH登录NAS后,相当于在NAS本地访问MariaDB(localhost),因此能正常连接;但Python直接远程连接时,NAS上的MariaDB默认仅监听本地回环地址(127.0.0.1),或未给数据库用户授权远程访问权限,导致握手阶段连接中断。
以下是两种可行的解决方案:
方案一:配置NAS的MariaDB允许局域网远程访问
这是更直接的方式,无需依赖SSH隧道:
修改MariaDB监听地址
- 登录NAS的DSM管理界面,打开
MariaDB 10套件的设置 - 进入「网络」选项,将监听地址从
127.0.0.1改为0.0.0.0(允许所有地址访问),或指定Ubuntu机器的局域网IP - 重启MariaDB服务
- 登录NAS的DSM管理界面,打开
给数据库用户授权远程访问权限
- SSH登录NAS,进入MariaDB命令行:
mysql -u root -p - 执行授权命令(替换占位符为你的实际信息):
若要允许该用户从任意局域网IP访问,可将-- 允许指定Ubuntu IP访问test_db库 GRANT ALL PRIVILEGES ON test_db.* TO '你的数据库用户名'@'Ubuntu局域网IP' IDENTIFIED BY '你的数据库密码'; FLUSH PRIVILEGES;Ubuntu局域网IP改为192.168.%.%(根据你的网段调整)
- SSH登录NAS,进入MariaDB命令行:
检查NAS防火墙
- 确保NAS防火墙允许MariaDB端口(默认3306)的入站连接,添加Ubuntu机器IP的访问规则
完成以上配置后,你的原有Python脚本即可正常使用,确认config.json中host为NAS的局域网IP,port为MariaDB端口(默认3306)。
方案二:用Python结合SSH隧道连接(无需修改MariaDB配置)
如果不想调整NAS的数据库远程访问设置,可通过SSH隧道将Ubuntu本地端口转发到NAS的MariaDB端口,模拟本地连接:
安装依赖库
pip install sshtunnel修改Python脚本
调整后的脚本如下(需补充NAS的SSH配置):import mariadb import json import sys from sshtunnel import SSHTunnelForwarder with open('config.json') as config_file: config = json.load(config_file)['mariadb'] ssh_config = config['nas_ssh'] try: # 建立SSH隧道 with SSHTunnelForwarder( (ssh_config['host'], ssh_config['port']), # NAS的SSH地址和端口(默认22) ssh_username=ssh_config['user'], ssh_password=ssh_config['password'], remote_bind_address=('127.0.0.1', config['raspi-svr']['port']) ) as tunnel: # 通过隧道连接MariaDB conn = mariadb.connect( user=config['raspi-svr']['user'], password=config['raspi-svr']['password'], host='127.0.0.1', port=tunnel.local_bind_port, database="test_db" ) cur = conn.cursor() print("数据库连接成功!") # 此处可执行数据库操作 conn.close() except mariadb.Error as e: print(f"MariaDB连接错误: {e}") sys.exit(1) except Exception as e: print(f"SSH隧道建立失败: {e}") sys.exit(1)对应的
config.json需添加NAS的SSH配置:{ "mariadb": { "raspi-svr": { "user": "你的数据库用户名", "password": "你的数据库密码", "host": "NAS局域网IP", "port": 3306 }, "nas_ssh": { "host": "NAS局域网IP", "port": 22, "user": "NAS的SSH用户名", "password": "NAS的SSH密码" } } }
错误排查提示
- 先通过
ping NAS局域网IP确认网络连通性 - 用
telnet NAS局域网IP 3306测试端口是否可访问,不通则说明存在网络/防火墙/监听地址问题 - 查看NAS上的MariaDB日志(路径:
/var/log/mariadb/mariadb.log),获取具体连接拒绝原因
内容的提问来源于stack exchange,提问作者user16243249
相关产品推荐
相关产品推荐

