连接PythonAnywhere托管MySQL数据库时出现Secsh通道0打开失败(Administratively prohibited)错误的求助
解决PythonAnywhere MySQL SSH隧道连接错误:Administratively prohibited
嘿,我来帮你搞定这个问题!你遇到的Administratively prohibited错误是PythonAnywhere的SSH验证限制导致的,具体原因和修复方案如下:
错误原因分析
2021-10-19 13:02:38,943| ERROR | Secsh channel 0 open FAILED: open failed: Administratively prohibited
2021-10-19 13:02:38,943| ERROR | 无法建立从本地('127.0.0.1', 62213)到隧道远程端('lewisMachilika.mysql.pythonanywhere-services.com', 3306)的连接:打开新SSH通道错误:ChannelException(1, 'Administratively prohibited')
这个报错的核心原因是:
- PythonAnywhere禁止使用密码登录SSH隧道:为了安全,PythonAnywhere早已取消了密码验证SSH隧道的方式,必须使用SSH密钥对进行身份验证,这是最常见的触发该错误的原因。
- 次要可能:如果你的
remote_bind_address配置有误,也可能触发类似权限错误,但优先排查密钥问题。
修复步骤
1. 在本地生成SSH密钥对
打开本地终端(Windows用PowerShell或Git Bash,Mac/Linux用终端),执行以下命令生成RSA密钥对(一路回车接受默认配置即可):
ssh-keygen -t rsa
生成后,密钥文件会保存在:
- 私钥:
~/.ssh/id_rsa(Windows路径通常是C:\Users\你的用户名\.ssh\id_rsa),务必保密,不要分享给任何人 - 公钥:
~/.ssh/id_rsa.pub(需要上传到PythonAnywhere)
2. 将公钥上传到PythonAnywhere
登录PythonAnywhere后台,按以下步骤操作:
- 点击右上角的账号名,进入Account页面
- 找到SSH keys选项,点击Add a new SSH key
- 打开本地的
id_rsa.pub文件,复制全部内容粘贴到输入框,保存即可
3. 修改Python代码,使用SSH密钥验证
把你原来的代码替换为以下版本,修改对应的用户名、密码和路径:
import MySQLdb import sshtunnel sshtunnel.SSH_TIMEOUT = 5.0 sshtunnel.TUNNEL_TIMEOUT = 5.0 with sshtunnel.SSHTunnelForwarder( ('ssh.pythonanywhere.com'), ssh_username='你的PythonAnywhere用户名', ssh_pkey='~/.ssh/id_rsa', # Windows用户替换为实际私钥路径,比如'C:/Users/xxx/.ssh/id_rsa' remote_bind_address=('你的用户名.mysql.pythonanywhere-services.com', 3306) ) as tunnel: connection = MySQLdb.connect( user='你的MySQL用户名(通常和PythonAnywhere用户名一致)', passwd='你的MySQL密码', host='127.0.0.1', port=tunnel.local_bind_port, db='你的数据库名称(格式为:用户名$数据库名)', ) # 示例:执行一个简单查询验证连接 cursor = connection.cursor() cursor.execute("SELECT 1;") print("连接成功!测试结果:", cursor.fetchone()) # 清理资源 cursor.close() connection.close()
4. 验证SSH连接(可选但推荐)
在本地终端执行以下命令,测试能否用密钥登录PythonAnywhere的SSH服务器:
ssh 你的用户名@ssh.pythonanywhere.com
如果能成功登录到PythonAnywhere的命令行界面,说明密钥配置完全正确,此时运行Python代码就应该能正常连接MySQL了。
额外注意事项
- 确认
remote_bind_address的正确性:你可以在PythonAnywhere的Databases页面找到准确的MySQL主机地址,格式一定是你的用户名.mysql.pythonanywhere-services.com - 不要将私钥文件上传到代码仓库或任何公共平台,避免账号泄露风险
内容的提问来源于stack exchange,提问作者lewis machilika




