当前位置: 首页 > news >正文

SSHv2公钥认证示例-Paramiko复用 Transport 连接

在这里插入图片描述

在 Paramiko 中复用 Transport 连接时,若要通过 公钥认证(而非密码)建立连接,需手动加载私钥并与 Transport 关联。以下是详细操作步骤及完整代码示例:


步骤 1:加载私钥文件

使用 RSAKeyEd25519Key 类加载本地私钥文件:

from paramiko import Transport, RSAKey# 加载私钥(支持加密的私钥)
private_key = RSAKey.from_private_key_file(filename='/path/to/private_key.pem',  # 私钥路径password='your_key_password'          # 若私钥有密码保护
)

步骤 2:创建 Transport 并连接

通过公钥认证建立连接,并复用该 Transport

# 创建 Transport 对象
transport = Transport(('hostname', 22))# 通过公钥认证连接
transport.connect(username='your_username', pkey=private_key  # 关键:传递私钥对象
)

步骤 3:复用 Transport 执行操作

复用已连接的 Transport 创建 SSHClient 或直接操作通道:

# 方法 1:绑定到 SSHClient
from paramiko import SSHClientssh = SSHClient()
ssh._transport = transport  # 复用 Transport
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())# 方法 2:直接操作通道
channel = transport.open_session()
channel.exec_command('df -h')
output = channel.recv(1024).decode()
print(output)
channel.close()

步骤 4:复用 Transport 创建 SFTP

from paramiko import SFTPClientsftp = SFTPClient.from_transport(transport)  # 复用 Transport
sftp.put('local_file.txt', 'remote_file.txt')
sftp.close()

完整代码示例

import paramiko
from paramiko import Transport, RSAKey, SSHClient, SFTPClient# 1. 加载私钥
private_key = RSAKey.from_private_key_file(filename='~/.ssh/id_rsa',password='key_password'  # 若无密码可省略
)# 2. 创建 Transport 并连接
transport = Transport(('your_host', 22))
transport.connect(username='your_user', pkey=private_key)try:# 3. 复用 Transport 执行命令ssh = SSHClient()ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('ls -l /tmp')print(stdout.read().decode())# 4. 复用 Transport 传输文件sftp = SFTPClient.from_transport(transport)sftp.put('localfile.txt', 'remotefile.txt')sftp.close()finally:# 5. 关闭 Transport(释放连接)transport.close()

关键注意事项

  1. 私钥权限

    • 确保私钥文件权限为 600
      chmod 600 ~/.ssh/id_rsa
      
    • 否则 Paramiko 会抛出 SSHException: Private key file is accessible to others
  2. 主机密钥验证
    生产环境中应避免使用 AutoAddPolicy,推荐提前将服务端公钥指纹加入 known_hosts

    ssh = SSHClient()
    ssh.load_system_host_keys()  # 加载系统已知主机密钥
    ssh.connect(...)  # 自动校验主机密钥
    
  3. 异常处理
    添加对认证失败、连接超时的捕获:

    try:transport.connect(...)
    except paramiko.AuthenticationException:print("公钥认证失败!")
    except paramiko.SSHException as e:print(f"SSH 错误: {e}")
    

复用连接的优势

  • 性能提升:避免重复的 TCP 连接和密钥交换开销。
  • 资源节省:在高频操作(如批量文件传输)中减少系统资源消耗。
  • 功能整合:同一连接支持混合操作(如命令执行 + SFTP 传输)。

相关文章:

  • 养生:塑造健康生活的良方
  • 【挑战项目】 --- 微服务编程测评系统(在线OJ系统)(二)
  • React 第三十八节 Router 中useRoutes 的使用详解及注意事项
  • HOT 100 | 【子串】76.最小覆盖子串、【普通数组】53.最大子数组和、【普通数组】56.合并区间
  • electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
  • 掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
  • “ES7+ React/Redux/React-Native snippets“常用快捷前缀
  • 【K8S系列】Kubernetes常用 命令
  • CUDA编程 - CUDA编程中处理半精度浮点运算(FP16) - fp16ScalarProduct
  • 5.9-selcct_poll_epoll 和 reactor 的模拟实现
  • window 显示驱动开发-配置内存段类型
  • 官方SDK停更后的选择:开源维护的Bugly Unity SDK
  • 数据库系统概论(七)初识SQL与SQL基本概念
  • `timescale 1ns/1ps的意义
  • DeepResearch深度搜索实现方法调研
  • 【大模型ChatGPT+ArcGIS】数据处理、空间分析、可视化及多案例综合应用
  • 34.笔记1
  • 如何用Jmeter实现自动化测试?
  • wsl - install RabbiqMQ
  • 复杂网络鲁棒性理论基础
  • 2025年度上海市住房城乡建设管理委工程系列中级职称评审工作启动
  • 构建菌株有效降解有机污染物,上海交大科研成果登上《自然》
  • 国家主席习近平在莫斯科出席红场阅兵式
  • 图忆|红场阅兵:俄罗斯30年来的卫国战争胜利日阅兵式
  • 异域拾异|大脚怪的形状:一项神秘社会学研究
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑