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

sshtunnel未使用指定密钥及私钥密码的问题求助

SSH隧道连接MySQL时无法识别指定备用密钥,始终提示默认密钥需密码

问题描述

我编写了一个通过SSH隧道连接MySQL服务器的Python脚本:

import mysql.connector
from sshtunnel import SSHTunnelForwarder


def query_mysql_server(query):
    with SSHTunnelForwarder(
        ('ssh_server_ip', 22),
        ssh_username='sshuser',
        ssh_pkey='/Users/myhomedir/.ssh/id_rsa',
        ssh_private_key_password='my_ssh_key_passphrase',
        remote_bind_address=('127.0.0.1', 3306)
    ) as server:

        conn = mysql.connector.connect(
            host='127.0.0.1',
            port=server.local_bind_port,
            user='mysqluser',
            password='mysqluserpass',
            database='mydb'
        )

        cursor = conn.cursor()
        cursor.execute(query)

        results = cursor.fetchall()
        for row in results:
            print(row)

        cursor.close()
        conn.close()

query = "SELECT * FROM users;"
query_mysql_server(query)

运行时出现错误:ERROR | Password is required for key /Users/myhomedir/.ssh/id_rsa

尝试改用无密码短语的备用密钥/Users/myhomedir/.ssh/app_key,但错误依旧指向默认的id_rsa,备用密钥未被识别。两个密钥都已通过ssh-add添加到SSH认证代理,默认密钥id_rsa为非OpenSSH格式的RSA密钥,系统为macOS。

解决方案

1. 强制禁用SSH配置自动加载,指定仅使用目标密钥

SSHTunnelForwarder默认会读取系统SSH配置文件,可能优先使用代理中的默认密钥。添加ssh_config=None参数,强制工具仅使用你指定的密钥:

with SSHTunnelForwarder(
    ('ssh_server_ip', 22),
    ssh_username='sshuser',
    ssh_pkey='/Users/myhomedir/.ssh/app_key',  # 替换为备用密钥路径
    ssh_config=None,  # 禁用自动加载SSH配置
    remote_bind_address=('127.0.0.1', 3306)
) as server:
    # 后续MySQL连接代码不变

2. 检查并修正备用密钥的权限

macOS下SSH密钥文件权限必须严格设为600(仅所有者可读可写),否则会被SSH工具忽略。执行以下命令修正:

chmod 600 /Users/myhomedir/.ssh/app_key

3. 手动加载密钥传入,绕过路径识别问题

如果指定路径仍不生效,尝试用paramiko手动加载密钥文件,直接传给ssh_private_key参数:

import mysql.connector
from sshtunnel import SSHTunnelForwarder
import paramiko

def query_mysql_server(query):
    # 手动加载备用密钥
    private_key = paramiko.RSAKey.from_private_key_file('/Users/myhomedir/.ssh/app_key')
    
    with SSHTunnelForwarder(
        ('ssh_server_ip', 22),
        ssh_username='sshuser',
        ssh_private_key=private_key,  # 传入加载好的密钥对象
        remote_bind_address=('127.0.0.1', 3306)
    ) as server:
        # 后续MySQL连接代码不变

4. 转换默认密钥格式(可选)

如果后续需要用到默认的id_rsa,可将其转换为OpenSSH兼容格式,避免识别问题:

ssh-keygen -p -f /Users/myhomedir/.ssh/id_rsa -m pem

内容的提问来源于stack exchange,提问作者equinoxe5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:45:13