NetMiko调用send_command报io.TextIOWrapper无rstrip属性错误
NetMiko批量命令执行报错修复方案
错误根因
- 你当前传入
send_command()的comandos变量是open()函数直接返回的文件操作句柄,类型为_io.TextIOWrapper,不是字符串类型。NetMiko执行命令前会调用字符串的rstrip()方法清理命令首尾空白,文件对象没有该方法,直接触发属性不存在的报错。 send_command()方法仅支持传入单个字符串格式的命令,你之前把整个文件读成一个大字符串传入时,所有换行的命令会被识别为一整串无效输入,设备无法返回匹配#提示符的结果,自然触发超时。- 读取命令文件后没有做拆分、空行过滤,直接传入的内容不符合NetMiko的参数要求。
- 运行时弹出的
GetPassWarning是IDE终端不支持密码无回显导致的提示,不影响脚本核心逻辑,可选择性屏蔽。
修复方法
- 正确读取命令文件:按行拆分内容,过滤空行、清理每行首尾的换行和空白字符,生成标准的命令列表。
- 区分命令场景选择对应NetMiko方法:
- 单个查看命令:使用
send_command(命令字符串) - 批量查看类命令(如
show vlan、show run等):遍历命令列表,逐个调用send_command()执行 - 批量配置类命令(如端口配置、vlan创建等):直接将命令列表传入
send_config_set()一次性执行
- 单个查看命令:使用
- 脚本执行完成后主动断开设备连接,释放会话。
修正后完整代码
import warnings from getpass import GetPassWarning # 屏蔽密码输入回显警告 warnings.filterwarnings("ignore", category=GetPassWarning) # 读取cli.txt中的命令,生成过滤后的命令列表 with open("cli.txt", 'r', encoding="utf-8") as c: batch_show_cmds = [line.strip() for line in c if line.strip()] for each_device in device_list: connection = ConnectHandler(**each_device) connection.enable() print(f'已连接到设备: {each_device["host"]}') # 逐个执行批量查看命令 for cmd in batch_show_cmds: print(f"\n----- 命令: {cmd} 执行结果 -----") output = connection.send_command(cmd, expect_string=r'#') print(output) # 断开设备连接 connection.disconnect()
如果你cli.txt中存放的是设备配置命令,不需要循环调用,直接替换成以下代码即可批量执行配置:
output = connection.send_config_set(batch_show_cmds) print(output)
内容的提问来源于stack exchange,提问作者Jardel D'Oliveira
相关产品推荐
相关产品推荐

