[MySql] ssh方式连接数据库

当服务器的数据库端口如3306未开放时,可以利用SSH通道通过Navicat进行连接。步骤包括设置SSH连接(使用服务器的IP、SSH端口、用户名和密码),然后在常规选项中输入数据库的主机(localhost)、端口、用户名和密码。这样无需开放数据库端口也能操作数据库。

前言

为了安全有时服务器未开放数据库访问端口,比如3306,
我们就无法通过navicat直接连接数据库.
如果服务器开放了ssh的端口,可以用ssh的方式连接数据库
工具:navicat

1.连接ssh

连接> mysql ,切换到ssh tab,勾选使用ssh通道

主机:宝塔ip(本项目在宝塔上部署)
端口:ssh端口,一般默认为22
用户名:服务器用户名 一般为root
密码:服务器密码

在这里插入图片描述

2.切换到常规tab

连接名:自定义即可 一般定义为数据库名称
主机:localhost
端口:mysql数据库端口 一般为3306
用户名:mysql数据库登录用户名 最高权限用户一般为root(可使用其他用户登录)
密码: mysql数据库登录用户对应密码 可在宝塔查看root的密码(可使用其他用户登录)

在这里插入图片描述

3. 点击连接就可以啦,这样不用开放3306端口也可以访问操作数据库了

<think>我们注意到用户的问题是关于使用Paramiko通过SSH连接MySQL数据库。但是,需要澄清的是:Paramiko是一个SSH客户端库,用于执行远程命令和传输文件,而MySQL连接通常使用数据库驱动(如MySQL Connector/Python)直接连接。不过,有一种场景是:当MySQL服务器位于只能通过SSH跳板机访问的网络中时,我们可以使用SSH隧道(端口转发)来安全地连接MySQL。 因此,用户的问题可以理解为:如何使用Paramiko建立SSH隧道,然后通过该隧道连接MySQL数据库。 步骤: 1. 使用Paramiko建立SSH连接。 2. 在SSH连接上创建隧道(端口转发),将本地一个端口转发到远程MySQL服务器的端口(默认3306)。 3. 然后,在本地使用MySQL连接连接到转发的端口(即本地端口),从而通过SSH隧道连接到远程MySQL。 具体实现: 首先,确保已安装Paramiko和MySQL连接器(例如mysql-connector-python): ```bash pip install paramiko==4.0.0 mysql-connector-python ``` 然后,编写代码: ```python import paramiko from paramiko import SSHClient from sshtunnel import SSHTunnelForwarder # 注意:这里使用了sshtunnel库,它基于Paramiko,简化了隧道建立 import mysql.connector # 如果不想使用sshtunnel库,也可以使用Paramiko的forward函数,但sshtunnel更简单 # 安装sshtunnel: pip install sshtunnel # SSH连接参数 ssh_host = 'ssh_server_ip' ssh_port = 22 ssh_user = 'username' ssh_password = 'password' # 或者使用密钥 # MySQL连接参数(在远程服务器上) mysql_host = '127.0.0.1' # 注意:在SSH隧道中,远程MySQL服务器相对于SSH服务器是localhost mysql_port = 3306 mysql_user = 'root' mysql_password = 'mysql_password' mysql_database = 'test' # 方法1:使用sshtunnel库(推荐) from sshtunnel import SSHTunnelForwarder # 创建SSH隧道 with SSHTunnelForwarder( (ssh_host, ssh_port), ssh_username=ssh_user, ssh_password=ssh_password, remote_bind_address=(mysql_host, mysql_port) ) as tunnel: # 获取转发的本地端口 local_port = tunnel.local_bind_port print(f"本地转发端口: {local_port}") # 现在通过本地端口连接MySQL conn = mysql.connector.connect( host='127.0.0.1', port=local_port, user=mysql_user, password=mysql_password, database=mysql_database ) # 执行SQL cursor = conn.cursor() cursor.execute("SELECT VERSION()") version = cursor.fetchone() print(f"MySQL版本: {version}") cursor.close() conn.close() # 方法2:直接使用Paramiko的端口转发(不使用sshtunnel库) # 步骤更复杂,需要自己处理线程和套接字 # 这里推荐使用sshtunnel,因为它封装了这些复杂操作 ``` 注意:如果用户坚持使用纯Paramiko,那么需要自己实现端口转发的线程管理。但为了简便和可维护性,建议使用sshtunnel。 安全提示: 1. 避免在代码中硬编码密码,建议使用环境变量或配置文件。 2. 使用密钥认证代替密码认证(如果可能)。 如果用户无法安装sshtunnel库,我们可以提供一个使用Paramiko直接创建隧道的示例,但这需要更多的代码: ```python import paramiko import mysql.connector import threading import socket # 创建一个SSH客户端 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ssh_host, ssh_port, ssh_user, ssh_password) # 设置端口转发 # 将本地端口3307转发到远程的mysql_host:mysql_port # 注意:在SSH服务器上,mysql_host通常是127.0.0.1(如果MySQLSSH在同一台服务器) transport = ssh.get_transport() transport.request_port_forward('', 3307) # 本地端口3307 # 创建一个线程来监听本地端口并转发 # 由于这需要处理套接字和线程,代码较长,这里不展开,建议使用sshtunnel ``` 因此,我们强烈推荐使用sshtunnel库,它简化了SSH隧道的创建和管理。 相关问题: 1. 如何通过Paramiko使用密钥认证建立SSH连接? 2. 使用SSH隧道连接数据库有哪些安全风险? 3. 如何测试SSH隧道的连通性? 4. 除了MySQLSSH隧道还能用于哪些数据库?</think>### 使用 Paramiko 通过 SSH 隧道连接 MySQL 数据库 在 Paramiko 4.0.0 中通过 SSH 连接 MySQL 需要建立 SSH 隧道,将本地端口转发到远程 MySQL 服务器。以下是完整实现方案: #### 1. 安装必要库 ```bash pip install paramiko==4.0.0 mysql-connector-python ``` #### 2. Python 实现代码 ```python import paramiko import mysql.connector import threading import time # SSH 连接配置 ssh_host = "your_ssh_host" # SSH服务器地址 ssh_port = 22 ssh_user = "your_ssh_user" ssh_key_path = "/path/to/ssh_key" # 或使用密码 # MySQL 配置(远程服务器上的MySQLmysql_host = "localhost" # 在SSH服务器上显示的MySQL地址 mysql_port = 3306 mysql_user = "db_user" mysql_password = "db_password" mysql_database = "db_name" # 创建SSH隧道 def create_ssh_tunnel(): client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 使用密钥认证(推荐) private_key = paramiko.RSAKey(filename=ssh_key_path) client.connect(ssh_host, ssh_port, ssh_user, pkey=private_key) # 或使用密码认证 # client.connect(ssh_host, ssh_port, ssh_user, "ssh_password") # 创建本地端口转发 (localhost:63306 -> 远程MySQL) transport = client.get_transport() transport.request_port_forward("", 63306) return client # 主程序 try: # 步骤1: 建立SSH隧道 ssh_client = create_ssh_tunnel() print("SSH隧道建立成功,本地端口: 63306") # 步骤2: 通过隧道连接MySQL conn = mysql.connector.connect( host="127.0.0.1", port=63306, user=mysql_user, password=mysql_password, database=mysql_database ) # 步骤3: 执行SQL查询 cursor = conn.cursor() cursor.execute("SELECT VERSION()") version = cursor.fetchone() print(f"MySQL版本: {version[0]}") # 示例查询 cursor.execute("SHOW TABLES") print("\n数据库表列表:") for table in cursor: print(f"- {table[0]}") except Exception as e: print(f"连接失败: {str(e)}") finally: # 清理资源 if 'cursor' in locals(): cursor.close() if 'conn' in locals(): conn.close() if 'ssh_client' in locals(): ssh_client.close() print("连接已关闭") ``` #### 3. 关键配置说明 1. **SSH隧道原理**: - 本地端口 63306 映射到远程服务器的 `localhost:3306` - MySQL 连接实际发送到本地的 63306 端口 - Paramiko 通过 SSH 隧道将请求转发到远程 MySQL 2. **认证方式**: ```python # 密钥认证(推荐) private_key = paramiko.RSAKey(filename="/path/to/key.pem") client.connect(..., pkey=private_key) # 密码认证 client.connect(..., password="ssh_password") ``` 3. **MySQL 连接参数**: - `host="127.0.0.1"`:固定指向本地 - `port=63306`:必须与隧道端口一致 - 其他参数使用远程 MySQL 的实际凭据 #### 4. 安全注意事项 1. **密钥保护**: ```python # 使用加密的密钥文件 private_key = paramiko.RSAKey.from_private_key_file( "key.pem", password="key_password" # 密钥文件的解密密码 ) ``` 2. **端口安全**: - 避免使用 3306 等常见端口 - 隧道建立后立即测试连接并尽快关闭 3. **连接验证**: ```python # 检查隧道是否活跃 if ssh_client.get_transport().is_active(): print("隧道状态: 活跃") else: print("隧道已断开") ``` #### 5. 常见错误处理 | 错误信息 | 解决方案 | |---------|---------| | `AuthenticationException` | 检查SSH密钥权限:`chmod 600 key.pem` | | `OperationalError: 2013` | 增加MySQL连接超时:`connect(..., connection_timeout=10)` | | `SSHException: No existing session` | 确认SSH服务器允许端口转发 | > **性能提示**:对于高频查询,建议保持SSH隧道长连接而非每次新建,但需添加心跳检测防止超时断开[^1]。 --- ### 相关问题 1. 如何通过 Paramiko 执行远程 MySQL 命令行操作? 2. SSH 隧道连接 MySQL 与直接连接的性能差异有多大? 3. 如何配置 MySQL 用户权限以允许 SSH 隧道连接? 4. Paramiko 4.0.0 中如何处理 SSH 连接超时和重试机制?[^2] [^1]: SSH 隧道保持活动连接的技术方案 [^2]: Paramiko 连接超时配置文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值