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
相关产品推荐
相关产品推荐

