You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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隧道:

  1. 修改MariaDB监听地址

    • 登录NAS的DSM管理界面,打开MariaDB 10套件的设置
    • 进入「网络」选项,将监听地址从127.0.0.1改为0.0.0.0(允许所有地址访问),或指定Ubuntu机器的局域网IP
    • 重启MariaDB服务
  2. 给数据库用户授权远程访问权限

    • SSH登录NAS,进入MariaDB命令行:
      mysql -u root -p
      
    • 执行授权命令(替换占位符为你的实际信息):
      -- 允许指定Ubuntu IP访问test_db库
      GRANT ALL PRIVILEGES ON test_db.* TO '你的数据库用户名'@'Ubuntu局域网IP' IDENTIFIED BY '你的数据库密码';
      FLUSH PRIVILEGES;
      
      若要允许该用户从任意局域网IP访问,可将Ubuntu局域网IP改为192.168.%.%(根据你的网段调整)
  3. 检查NAS防火墙

    • 确保NAS防火墙允许MariaDB端口(默认3306)的入站连接,添加Ubuntu机器IP的访问规则

完成以上配置后,你的原有Python脚本即可正常使用,确认config.json中host为NAS的局域网IP,port为MariaDB端口(默认3306)。


方案二:用Python结合SSH隧道连接(无需修改MariaDB配置)

如果不想调整NAS的数据库远程访问设置,可通过SSH隧道将Ubuntu本地端口转发到NAS的MariaDB端口,模拟本地连接:

  1. 安装依赖库

    pip install sshtunnel
    
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:50:16