Robot Framework SSHLibrary公钥登录失败排查与配置求助
问题背景
尝试在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中开启了公钥认证:
- 编辑配置文件:
sudo vi /etc/ssh/sshd_config - 确保以下配置未被注释:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 - 重启sshd服务:
sudo systemctl restart sshd
错误原因说明
日志中的AttributeError: 'NoneType' object has no attribute 'public_blob'是因为Paramiko未能成功加载私钥对象,常见原因包括:密钥路径错误、文件权限不符合要求、Paramiko版本与OpenSSH不兼容,上述解决方案可针对性解决这些问题。
内容的提问来源于stack exchange,提问作者remington howell

