使用NAPALM通过SSH密钥连接Cisco路由器失败求助
解决NAPALM连接Cisco IOS时SSH密钥认证失败的问题
核心正确配置示例
直接使用以下格式编写NAPALM连接代码,避免参数错误:
from napalm import get_network_driver # 选择Cisco IOS驱动 driver = get_network_driver('ios') # 初始化设备连接 device = driver( hostname='你的路由器IP/主机名', username='netbox', password='', # 必须传空字符串,不能省略或传None optional_args={ 'ssh_key_file': '/home/netbox/.ssh/id_rsa', # 必须用绝对路径,不要用~ 'timeout': 60 # 可选,防止连接超时 } ) try: device.open() # 测试获取配置 running_config = device.get_config()['running'] print(running_config) finally: device.close()
关键排查步骤
- 绝对路径强制要求:NAPALM运行在非交互式进程中,无法解析
~环境变量,必须写死密钥文件的绝对路径(比如/home/netbox/.ssh/id_rsa或/opt/netbox/.ssh/id_rsa,取决于你的NetBox安装路径)。 - 密钥权限严格控制:SSH安全机制会拒绝权限过松的密钥,执行以下命令修正:
sudo chown netbox:netbox /home/netbox/.ssh/id_rsa sudo chmod 600 /home/netbox/.ssh/id_rsa sudo chmod 644 /home/netbox/.ssh/id_rsa.pub - 密码参数不能省略:IOS驱动要求显式传入
password='',如果留空或传None,会触发密码输入提示。 - 驱动类型不能选错:必须使用
'ios'驱动,不要混淆成'iosxr'或'nxos',不同驱动的optional_args参数规则不同。 - NetBox集成配置修正:如果是在NetBox后台配置NAPALM,修改
configuration.py中的参数:NAPALM_USERNAME = 'netbox' NAPALM_PASSWORD = '' NAPALM_ARGS = { 'ssh_key_file': '/home/netbox/.ssh/id_rsa', 'timeout': 60, }
快速验证方法
在NetBox服务器上以netbox用户身份运行测试脚本,排除上下文权限问题:
sudo -u netbox python3 << 'EOF' from napalm import get_network_driver driver = get_network_driver('ios') device = driver( hostname='192.168.1.1', username='netbox', password='', optional_args={'ssh_key_file': '/home/netbox/.ssh/id_rsa'} ) device.open() print(device.get_facts()) device.close() EOF
内容的提问来源于stack exchange,提问作者DrunkMunki
相关产品推荐
相关产品推荐

