
使用 Netmiko 处理非标准 Linux CLI 设备
在使用 Netmiko 自动化管理设备时,如果设备基于 Linux 内核,但其命令行界面 (CLI) 与标准 Linux 环境(例如 bash)不同,则可能会遇到问题。Netmiko 默认情况下针对标准 Linux CLI 进行了优化,例如检测 “#” 或 “$” 结尾的 prompt,并尝试执行一些 Linux 特定的会话准备操作。当遇到自定义 CLI 时,这些默认行为可能导致连接失败或自动化脚本无法正常工作。
问题分析
Netmiko 的设计思路是,对于标准 CLI 环境,它能够自动处理 prompt 检测、禁用分页、调整终端宽度等任务。然而,对于具有自定义 CLI 的设备,这些预设行为可能不适用,甚至会干扰连接过程。例如,Avocent ACS800/8000 和 ACS600/6000 控制服务器的 prompt 格式为 –:- / cli->,与 Netmiko 期望的 prompt 格式不符,从而导致 ReadTimeout 异常。
解决方案
为了解决这个问题,可以采取以下两种主要方法:
使用 “generic” 设备类型:
将 device_type 设置为 “generic” 可以禁用 Netmiko 的所有内置 prompt 检测和会话准备操作。这使得 Netmiko 仅建立一个基本的 SSH 连接,而不尝试执行任何特定于设备的配置。
from netmiko import ConnectHandlerdevice = { "host": "your_device_ip", "username": "your_username", "password": "your_password", "device_type": "generic", # 设置为 generic "session_log": "netmiko_session.log", "auto_connect": False}session = ConnectHandler(**device)session.establish_connection()# 现在可以发送命令并接收响应output = session.send_command("show version")print(output)session.disconnect()
注意事项: 使用 “generic” 设备类型后,需要手动处理 prompt,并确保发送的命令与设备的 CLI 兼容。
使用 find_prompt 方法:
find_prompt 方法可以用来动态地检测设备的 prompt。它发送一个换行符,并将返回的字符串识别为 prompt。
from netmiko import ConnectHandlerdevice = { "host": "your_device_ip", "username": "your_username", "password": "your_password", "device_type": "linux", # 可以使用 linux 或 generic "session_log": "netmiko_session.log", "auto_connect": False}session = ConnectHandler(**device)session.establish_connection()# 动态检测 promptprompt = session.find_prompt()print(f"Detected prompt: {prompt}")# 现在可以使用检测到的 prompt 发送命令output = session.send_command("show version", expect_string=prompt)print(output)session.disconnect()
注意事项: find_prompt 方法需要在连接建立后调用,并且需要在 send_command 方法中使用 expect_string 参数来指定期望的 prompt。
示例代码:
以下代码示例演示了如何结合使用 “generic” 设备类型和手动 prompt 处理来实现自动化:
from netmiko import ConnectHandlerimport timedevice = { "host": "your_device_ip", "username": "your_username", "password": "your_password", "device_type": "generic", "session_log": "netmiko_session.log", "auto_connect": False}session = ConnectHandler(**device)session.establish_connection()# 等待 prompt 出现time.sleep(1) # 适当调整等待时间# 发送一个换行符,读取 promptsession.write_channel("n")time.sleep(0.5) # 确保 prompt 返回prompt = session.read_channel()print(f"Detected prompt: {prompt.strip()}")# 发送命令session.write_channel("show versionn")time.sleep(1) # 等待命令执行完成output = session.read_channel()print(output)session.disconnect()
总结
通过将 device_type 设置为 “generic” 并结合 find_prompt 方法或手动 prompt 处理,可以有效地解决 Netmiko 在处理具有自定义 CLI 的 Linux 设备时遇到的问题。这种方法允许用户建立 SSH 连接,并执行自动化任务,即使设备的 CLI 与 Netmiko 的默认配置不兼容。在使用这些方法时,需要仔细处理 prompt,并确保发送的命令与设备的 CLI 语法一致。
以上就是使用 Netmiko 处理非标准 Linux CLI 设备的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373488.html
微信扫一扫
支付宝扫一扫