You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Robot Framework SSHLibrary公钥登录失败排查与配置求助

在Robot Framework中使用SSHLibrary实现SSH公钥登录的正确配置方法

问题背景

尝试在Robot Framework中通过SSHLibrary编写通用SSH执行命令方法,使用公钥认证替代密码,但Login With Public Key步骤始终报错:Login with public key failed for user 'user',且日志中出现AttributeError: 'NoneType' object has no attribute 'public_blob'错误。已确认密码登录正常、密钥格式正确且已同步到目标服务器、执行用户有权访问密钥文件,但问题仍未解决。

相关代码片段

Execute Command over SSH
    [Arguments]    ${host}    ${username}    ${command}

    Enable Ssh Logging    sshlog.txt
    Open Connection    ${host}
    Login With Public Key    username=${username}    keyfile=%{HOME}/.ssh/id_rsa

已完成的排查动作

  • 密码登录可正常执行;
  • 确认私钥为RSA格式,公钥已同步至目标服务器;
  • 执行Robot Framework的用户可访问本地SSH配置;
  • 尝试使用look_for_keys自动发现密钥,路径验证正确;
  • 未启用SSH代理;
  • 确认依赖版本:CentOS、openssh v7.4、python v3.7.3、paramiko v2.6.0、robotframework v5.0、sshlibrary v3.8;
  • 尝试通过read_config引用SSH别名配置文件,仍失败。

关键日志信息

Connected (version 2.0, client OpenSSH_8.0)
Authentication (publickey) failed.
Authentication (password) failed.
Unknown exception: 'NoneType' object has no attribute 'public_blob'
Traceback (most recent call last):
   File "/home/user/venv/lib/python3.7/site-packages/paramiko/transport.py", line 2109, in run
     handler(self.auth_handler, m)
   File "/home/user/venv/lib/python3.7/site-packages/paramiko/auth_handler.py", line 289, in _parse_service_accept
     if self.private_key.public_blob:
AttributeError: 'NoneType' object has no attribute 'public_blob'

解决方案

1. 修复环境变量引用格式

Robot Framework中环境变量的正确引用方式是${HOME}而非%{HOME},修改密钥路径配置:

Login With Public Key    username=${username}    keyfile=${HOME}/.ssh/id_rsa

也可以直接使用绝对路径测试,比如/home/your_username/.ssh/id_rsa,排除变量解析问题。

2. 严格设置密钥文件权限

SSH对密钥文件权限要求极高,权限过宽会导致认证失败,执行以下命令修正权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

3. 升级Paramiko版本解决兼容性问题

Paramiko v2.6.0与部分OpenSSH版本存在兼容性问题,建议升级到稳定版本:

pip install --upgrade paramiko==2.12.0

升级后重新运行测试用例。

4. 显式指定公钥文件(可选)

部分场景下,显式指定公钥文件可帮助SSHLibrary正确匹配密钥对,修改登录步骤:

Login With Public Key    username=${username}    keyfile=${HOME}/.ssh/id_rsa    publickeyfile=${HOME}/.ssh/id_rsa.pub

5. 验证密钥加载状态

添加调试步骤确认私钥是否能被正确读取:

Execute Command over SSH
    [Arguments]    ${host}    ${username}    ${command}

    Enable Ssh Logging    sshlog.txt
    ${private_key}=    Read File    ${HOME}/.ssh/id_rsa
    Log    Private Key Loaded: ${private_key[:100]}...    level=DEBUG
    Open Connection    ${host}
    Login With Public Key    username=${username}    keyfile=${HOME}/.ssh/id_rsa

如果读取失败,检查路径是否正确或执行用户是否有读取权限。

6. 检查目标服务器SSH配置

确认目标服务器的sshd_config中开启了公钥认证:

  1. 编辑配置文件:
    sudo vi /etc/ssh/sshd_config
    
  2. 确保以下配置未被注释:
    PubkeyAuthentication yes
    AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
    
  3. 重启sshd服务:
    sudo systemctl restart sshd
    

错误原因说明

日志中的AttributeError: 'NoneType' object has no attribute 'public_blob'是因为Paramiko未能成功加载私钥对象,常见原因包括:密钥路径错误、文件权限不符合要求、Paramiko版本与OpenSSH不兼容,上述解决方案可针对性解决这些问题。

内容的提问来源于stack exchange,提问作者remington howell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:31:06