0

我被困在这里一个多小时,但似乎无法找到我的问题的解决方案。问题是我无法完全匹配字符串输出。

实际输出:

hostname#$192.168.1.1/out/c2960x-universalk9-mz.152-7.E3.bin flash:c2960x-universalk9-mz.152-7.E3.bin
Destination filename [c2960x-universalk9-mz.152-7.E3.bin]? 

我的代码不起作用:

commandsend = "copy ftp://206.112.194.143/out/c2960x-universalk9-mz.152-7.E3.bin flash:c2960x-universalk9-mz.152-7.E3.bin"
output = connection.send_command(commandsend,expect_string=r'Destination filename')
output += connection.send_command('\n',expect_string=r'#')

复制ftp://xxxx/out/c2960x-universalk9-mz.152-7.E3.bin flash:c2960x-universalk9-mz.152-7.E3.bin 21:11:27.067 GMT 2021 年 5 月 12 日星期三 Traceback(最最近通话最后):文件“./svu.py”,第 292 行,在 output = uploading_update(models,ver[0],ver[1],ver[2],ver[3]) # 发送到 func {' CSR1000V': ['12.2.55', File "./svu.py", line 119, in uploading_update output = connection.send_command(commandsend,expect_string=r'Destination filename') File "/home/repos/public/Python /lib/python3.6/site-packages/netmiko/base_connection.py",第 1112 行,在 send_command search_pattern)) OSError:在 send_command_expect 中从未检测到搜索模式:目标文件名

我尝试使用以下内容,但仍然无法正常工作

output = connection.send_command(commandsend,expect_string=r'Destination.*')
output = connection.send_command(commandsend,expect_string='Destination.*')
output = connection.send_command(commandsend,expect_string=r'Destination filename.+')

我什至尝试调整延迟因子和 fast_cli=False 但仍然相同。

当我尝试使用确切的输出时。我看到以下错误。

output = connection.send_command(commandsend,expect_string=r'Destination filename [c2960x-universalk9-mz.152-7.E3.bin]? ')

位置 27 的错误字符范围 xu

我这是一个错误还是什么?我需要使用任何缺少的选项吗?

4

1 回答 1

-1

您的问题expect_string=r'Destination filename [c2960x-universalk9-mz.152-7.E3.bin]? '是,Netmiko 将expect_string参数解释为正则表达式(正则表达式)字符串,因此括号内的内容[]视为您尝试匹配的字符范围,这就是错误的来源。在您的情况下,您希望匹配确切的字符[]字符,因此您需要使用\“原始”字符串或\\“普通”字符串来转义它们。这同样适用于?.字符,它们在正则表达式中具有特殊含义。

因此正确的命令是:

output = connection.send_command(commandsend,expect_string=r'Destination filename \[c2960x-universalk9-mz\.152-7\.E3\.bin\]\? ')

您可以使用regex101等在线正则表达式工具来帮助您构建和测试您的正则表达式。

另外,如果您正在与 Cisco 打交道,我认为您应该查看file prompt quiet命令,它会禁用这些提示。

于 2021-09-04T09:28:36.730 回答