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

PythonAnywhere SSH在CMD可用但Jupyter Notebook连接失败求助

问题解决方向

错误原因分析

你遇到的两个核心问题:

  1. sshtunnel默认会尝试加载本地~/.ssh/id_rsa密钥文件,若该文件设置了密码保护,就会触发"Password is required for key"错误
  2. 你的Python环境中SSH客户端默认支持的主机密钥类型,和PythonAnywhere服务器不兼容,导致"Incompatible ssh peer (no acceptable host key)"

CMD能正常连接是因为系统SSH客户端的默认行为更灵活:优先使用密码登录,且支持更多主机密钥类型,和sshtunnel的默认配置不一致。

具体解决方案

1. 强制忽略本地密钥文件,仅用密码登录

在SSHTunnelForwarder参数中添加ssh_pkey=None,阻止程序加载本地SSH密钥,强制使用你指定的密码完成认证。

2. 指定兼容的主机密钥类型

添加host_key_types参数,明确声明PythonAnywhere支持的密钥类型,解决主机密钥不兼容问题。

修改后的完整代码

import sshtunnel
import MySQLdb

sshtunnel.SSH_TIMEOUT = 10.0
sshtunnel.TUNNEL_TIMEOUT = 10.0

with sshtunnel.SSHTunnelForwarder(
    ('ssh.pythonanywhere.com'),
    ssh_username='MyUserName', 
    ssh_password='MyPWD',
    ssh_pkey=None,  # 禁用本地密钥文件加载
    host_key_types=['ssh-rsa', 'rsa-sha2-256', 'rsa-sha2-512'],  # 指定兼容的主机密钥类型
    remote_bind_address=('MyUserName.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
    connection = MySQLdb.connect(
        user='MyUserName',
        passwd='MyPWD',
        host='127.0.0.1', 
        port=tunnel.local_bind_port,
        db='MyUserName$DBName',
    )
    q1 = """SELECT session_key, session_data, expire_date
        FROM django_session;"""
    cursor = connection.cursor()
    cursor.execute(q1)
    print(cursor.fetchall())
    connection.close()

额外排查步骤

如果修改后仍有问题:

  • 验证密码凭证正确性:在CMD中运行ssh -o PreferredAuthentications=password MyUserName@ssh.pythonanywhere.com,强制只用密码登录
  • 更新sshtunnel到最新版本:执行pip install --upgrade sshtunnel,新版本可能修复了密钥兼容问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:42:11