Python使用SSHTunnelForwarder建立SSH隧道失败求助
SSH隧道公钥认证失败排查与解决
核心排查步骤
检查私钥文件权限
bash的ssh命令对私钥权限要求严格(必须是600,即仅所有者可读可写),Python进程可能因权限不足无法读取私钥。执行chmod 600 /path/to/my/private.ca.key修正权限。显式指定私钥参数
sshtunnel不会自动识别非默认路径的私钥,必须在代码中明确指定。如果私钥设置了密码,还需添加密码参数。验证私钥格式与兼容性
确认私钥是OpenSSH兼容格式(开头为-----BEGIN RSA PRIVATE KEY-----或-----BEGIN OPENSSH PRIVATE KEY-----),若为旧格式可通过ssh-keygen -p -f /path/to/my/private.ca.key转换。开启调试日志定位问题
通过日志查看SSH认证的详细过程,确定失败环节。
修正后的代码示例
from sshtunnel import SSHTunnelForwarder import logging # 开启调试日志,便于排查细节 logging.basicConfig(level=logging.DEBUG) try: with SSHTunnelForwarder( ('ourserver.com', 22), ssh_username='user', ssh_pkey='/path/to/my/private.ca.key', # 私钥有密码时取消注释 # ssh_private_key_password='your_key_passphrase', remote_bind_address=('127.0.0.1', 3306), local_bind_address=('127.0.0.1', 3306) ) as tunnel: print(f"隧道已建立,本地端口: {tunnel.local_bind_port}") input("按回车键关闭隧道...") except Exception as e: print(f"建立隧道失败: {str(e)}")
额外排查手段
升级依赖库
旧版本的sshtunnel或其依赖paramiko可能存在ssh-rsa算法支持问题,执行pip install --upgrade sshtunnel paramiko更新到最新版。用paramiko单独测试SSH连接
排除sshtunnel本身的问题,直接用底层库测试认证:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect( 'ourserver.com', username='user', key_filename='/path/to/my/private.ca.key', # 私钥有密码时取消注释 # password='your_key_passphrase' ) print("SSH连接成功") ssh.close() except Exception as e: print(f"连接失败: {str(e)}")
- 检查服务器配置
确认服务器sshd_config中开启了PubkeyAuthentication yes,且目标用户的~/.ssh/authorized_keys文件包含对应公钥,文件权限为600,目录权限为700。
内容的提问来源于stack exchange,提问作者Octopus
相关产品推荐
相关产品推荐

