当前位置: 首页 > 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 传输)。
http://www.xdnf.cn/news/353863.html

相关文章:

  • 港大今年开源了哪些SLAM算法?
  • Github 热点项目 Cursor开源代替,AI代理+可视化编程!支持本地部署的隐私友好型开发神器。
  • LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)
  • 聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE
  • 推挽输出、开漏输出、上拉电阻、下拉电阻、低边驱动、高边驱动【简版总结】
  • 【Git】查看tag
  • 基于阿里云DataWorks的物流履约时效离线分析
  • STM32定时器5触发定时器4启动
  • 【软件测试】软件缺陷(Bug)的详细描述
  • 使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
  • 利用GPT实现油猴脚本—网页滚动(优化版)
  • 豆包:基于多模态交互的智能心理咨询机器人系统设计与效果评估——情感计算框架下的对话机制创新
  • Spark,在shell中运行RDD程序
  • 【SQL系列】多表关联更新
  • 手持气象仪:能够实时测量多种气象参数,保数据采集的准确性与实时性
  • 掌握Multi-Agent实践(三):ReAct Agent集成Bing和Google搜索功能,采用推理与执行交替策略,增强处理复杂任务能力
  • Spring Boot 框架概述
  • 【计算机视觉】Car-Plate-Detection-OpenCV-TesseractOCR:车牌检测与识别
  • 【css】css统一设置变量
  • 更新 / 安装 Nvidia Driver 驱动 - Ubuntu - 2
  • 数据类型详解(布尔值、整型、浮点型、字符串等)-《Go语言实战指南》
  • istio in action之Gateway流量入口与安全
  • 分析NVIDIA的股价和业绩暴涨的原因
  • Zabbix监控 RabbitMQ 指定消息队列名称(pull_alarms )的消费者
  • 富乐德传感技术盘古信息 | 锚定“未来工厂”新坐标,开启传感器制造行业数字化转型新征程
  • IC解析之TPS92682-Q1(汽车LED灯控制IC)
  • 【C/C++】C语⾔内存函数
  • [Errno 122] Disk quota exceeded
  • Linux59 SSH配置前瞻 JumpServer双网卡ping通
  • 金仓数据库永久增量备份技术原理与操作