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

Paramiko 是一个用 Python 编写的 SSHv2 协议实现库,用于安全地进行远程连接、执行命令、传输文件(SFTP)等操作

Paramiko 是一个用 Python 编写的 SSHv2 协议实现库,用于安全地进行远程连接、执行命令、传输文件(SFTP)等操作。它不依赖外部 SSH 二进制程序(如 OpenSSH),纯 Python 实现,跨平台兼容性好,广泛应用于自动化运维、网络设备管理、CI/CD 脚本等场景。

核心功能包括:

  • 建立 SSH 连接(支持密码、私钥、密钥口令等多种认证方式)
  • 执行远程 Shell 命令并获取标准输出/错误
  • 使用 SFTP 子系统上传/下载文件、管理远程目录
  • 支持通道(Channel)复用、会话保持、超时与异常处理

基础示例(密码登录执行命令):

importparamiko client=paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 自动接受未知主机密钥(生产环境应校验)try:client.connect(hostname='192.168.1.100',username='user',password='pass',timeout=10)stdin,stdout,stderr=client.exec_command('uptime')print(stdout.read().decode())finally:client.close()

使用私钥登录示例:

private_key=paramiko.RSAKey.from_private_key_file('/path/to/id_rsa',password='key_pass')# 若私钥有密码client.connect(hostname='192.168.1.100',username='user',pkey=private_key)

SFTP 文件上传示例:

sftp=client.open_sftp()sftp.put('local.txt','/remote/local.txt')sftp.close()

⚠️ 安全提示:

  • 生产环境中避免AutoAddPolicy(),应使用RejectPolicy()并预置可信 host key;
  • 敏感凭证(密码、私钥)建议通过环境变量或密钥管理服务加载;
  • 始终显式关闭连接(close())或使用with上下文管理器(需封装适配)。
    在 Paramiko 中安全验证远程服务器的 SSH 主机密钥,是防范中间人攻击(MITM)的核心措施。绝不能使用AutoAddPolicy()生产环境,而应显式校验主机密钥是否可信。以下是推荐的安全实践:

✅ 正确做法:使用paramiko.MissingHostKeyPolicy的子类或预置已知主机密钥

方案一:基于已知 hosts 文件(推荐,类 OpenSSH 行为)

importparamiko# 加载已知主机密钥(类似 ~/.ssh/known_hosts)host_keys=paramiko.HostKeys()host_keys.load('/path/to/known_hosts')# 可为 OpenSSH 格式文件client=paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.RejectPolicy())# 拒绝未知主机client.set_host_keys(host_keys)try:client.connect(hostname='192.168.1.100',username='user',key_filename='/id_rsa')print("✅ 连接成功,主机密钥已验证")exceptparamiko.BadHostKeyExceptionase:print(f"❌ 主机密钥不匹配:{e}")exceptparamiko.AuthenticationException:print("❌ 认证失败")exceptExceptionase:print(f"❌ 连接异常:{e}")finally:client.close()

方案二:首次连接时手动确认并持久化(交互式安全初始化)

defconnect_with_manual_verification(hostname,username,**kwargs):client=paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.RejectPolicy())try:client.connect(hostname,username,**kwargs)returnclientexceptparamiko.SSHExceptionase:if"No hostkey for server"instr(e)orisinstance(e,paramiko.BadHostKeyException):# 获取远程主机密钥(不验证时临时连接)transport=paramiko.Transport((hostname,22))transport.start_client()remote_key=transport.get_remote_server_key()fingerprint=remote_key.get_fingerprint().hex()# SHA256 hex(Paramiko ≥ 2.10)print(f"⚠️ 首次连接{hostname},密钥指纹:{fingerprint}")confirm=input("是否信任该密钥?(y/N): ").strip().lower()ifconfirm=='y':# 手动添加到 known_hostshost_keys=paramiko.HostKeys()host_keys.add(hostname,remote_key.get_name(),remote_key)host_keys.save('/path/to/known_hosts')transport.close()returnconnect_with_manual_verification(hostname,username,**kwargs)else:raiseRuntimeError("用户拒绝信任主机密钥")raisee

方案三:硬编码可信公钥(适用于固定、受控环境)

expected_key=paramiko.RSAKey(data=bytes.fromhex("..."))# 从已验证的服务器导出的公钥 hexclient=paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.RejectPolicy())try:client.connect(hostname='192.168.1.100',username='user',pkey=private_key)# 手动校验transport=client.get_transport()remote_key=transport.get_remote_server_key()ifremote_key.asbytes()!=expected_key.asbytes():raiseValueError("❌ 主机密钥与预期不符!")exceptExceptionase:print(e)

🔍 补充建议:

  • 使用transport.get_remote_server_key().get_name()获取密钥类型(ssh-rsa,ecdsa-sha2-nistp256,ssh-ed25519
  • Paramiko ≥ 2.10 默认使用 SHA256 指纹;旧版本用.get_fingerprint()返回 MD5(不安全,已弃用)
  • 可结合ssh-keyscan提前批量获取可信密钥:ssh-keyscan -t rsa,ecdsa,ed25519 host >> known_hosts

✅ 总结:安全 =拒绝未知 + 显式信任 + 持久化验证,而非自动接受。

http://www.jsqmd.com/news/1191587/

相关文章:

  • 高考地理台风题目答题框架:从形成机制到影响分析
  • OMC多Agent编排系统:软件工程自动化的操作系统
  • NI HIL自动化测试06-完整工具链展示
  • 多维聚合实战:从SQL到Pandas的OLAP数据操作心法
  • 制品库jfrog-artifactory搭建
  • Whisper.cpp:零依赖、高性能的C++语音识别引擎部署与优化指南
  • MSP430FR599x低功耗设计:从LPM模式到时钟系统的嵌入式节能实践
  • 从等效概念到三相电路:Y-Δ变换的工程应用与实例解析
  • 2026年大同离婚律师选对省心 张超律师家事经验丰富推荐 - 本地品牌推荐
  • 深入解析DLP3310 DMD:微型高清显示核心架构与工程实践
  • DRA75x硬件设计:电气特性与电源时序的实战解析
  • C++入门基础:从零到一掌握高性能编程核心
  • C++线程安全单例模式:从static基础到Meyers‘ Singleton实战
  • 基于STM32与FreeRTOS的智能家居控制器多任务调度设计与实现
  • Miniconda安装实战:轻量部署、环境隔离与跨平台配置指南
  • C++初始化全解析:从基础语法到实战陷阱,掌握现代C++核心编程
  • AI Agent与Unity集成:11天实现游戏原型自动化开发
  • 【蓝牙精品系列文档】【04_blemesh model】01_访问层
  • Clang/LLVM 四种生产级安装方式与工程化管理指南
  • Unity多人游戏开发入门:30分钟构建首个网络同步Demo
  • 2026年大同企业老板力荐合同纠纷律师 5位实战精选推荐 - 本地品牌推荐
  • 真力时官方更换原装表带价格查询|全新服务热线及门店地址权威信息公告(2026年7月最新) - 亨得利钟表维修中心
  • Python游戏自动化:Interception底层输入模拟实战指南
  • CTF逆向实战:从魔改UPX脱壳到RC4、SM4密码算法分析
  • 【紧急预警】LangChain 0.1.20+版本Chain.run()存在静默降级风险!3行代码检测+2种兼容性兜底方案(附CVE-2024-LC001技术通告)
  • IP核之RAM:从配置到实战,解锁FPGA高效数据缓存方案
  • MoviePy 是一个基于 Python 的开源视频编辑库,用于剪辑、合成、处理和生成视频
  • 2025年C++跨端架构演进:逻辑统一、数据驱动与AI辅助的工程实践
  • Windows下配置glslangValidator实现本地GLSL语法检查与VS Code集成
  • DHCP协议深度解析:从DORA流程到安全实践