PythonAnywhere SSH在CMD可用但Jupyter Notebook连接失败求助
问题解决方向
错误原因分析
你遇到的两个核心问题:
sshtunnel默认会尝试加载本地~/.ssh/id_rsa密钥文件,若该文件设置了密码保护,就会触发"Password is required for key"错误- 你的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
相关产品推荐
相关产品推荐

