【问题标题】:Python | Netmiko蟒蛇 |网美子
【发布时间】:2018-08-12 08:38:14
【问题描述】:

我正在用 Python 编写一个脚本,使用 Netmiko 自动升级 450 多个路由器。它们是 881/887、1921 和 2901 的混合体。

我正在使用 Netmiko,并且已经研究了如何确定型号并复制适当的 IOS 版本。我遇到的问题是重新加载路由器。我正在尝试使用 send_command_expect 函数,但我无法让它工作。

这是我试图实现它的方法。任何帮助表示赞赏。

import getpass
import time
from netmiko import ConnectHandler, file_transfer

host = "10.0.0.1"
u = "cisco"
p = "cisco"
source_file = "c800-universalk9-mz.SPA.155-3.M5.bin"

router = {
    'device_type': "cisco_ios",
    'ip': host,
    'username': u,
    'password': p,
}

try:
    ssh_conn = ConnectHandler(**router)
    print ("Connection successful\n")
except:
    print ("Login failure\n")
    sys.exit()

output = ssh_conn.send_command_expect('write mem')
output += ssh_conn.send_command('reload')
output += ssh_conn.send_command('\n')enter code here

以下是错误信息:

192-168-1-6:CiscoUpgrade sudarshanv$ python3 test.py
Connection successful

Traceback (most recent call last):
  File "test.py", line 25, in <module>
    output += ssh_conn.send_command('reload')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/netmiko/base_connection.py", line 1112, in send_command
    search_pattern))
OSError: Search pattern never detected in send_command_expect: HomeRTR\#
192-168-1-6:CiscoUpgrade sudarshanv$

【问题讨论】:

    标签: python python-3.x netmiko


    【解决方案1】:

    我想通了,在这里发布解决方案是为了总体利益。 解决方法是使用 send_command_timing 函数而不是 send_command。

    【讨论】:

      【解决方案2】:

      问题是.send_command() 等待预期的字符串停止。因为您使用'device_type': "cisco_ios",所以预期的字符串是“#”。

      当您发送命令“重新加载”时,“#”将永远不会出现,这就是您收到此错误的原因。你也可以使用如下的发送命令:

      .send_command('your command', expect_string = '[#\?$]')
      

      这样您可以更改例外字符串以完成此功能。您还可以在expect_string 中使用正则表达式。

      【讨论】:

        【解决方案3】:

        我最近一直在玩这个,这是我的 2 美分。祝大家好运!

        第 1 步:创建连接处理程序

        导入 netmiko

        connection = netmiko.ConnectHandler(ip="192.168.30.161", device_type='cisco_ios', username='cisco', password='cisco123')

        第 2 步:检查连接

        联系

        第 3 步:对于 Cisco 路由器和交换机,您期望 expect_string='[confirm]'

        connection.send_command('reload', expect_string='[confirm]') '继续重新加载? [确认]'

        connection.send_command('\n')

        connection.send_command('y')

        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "/usr/local/lib/python3.8/dist-packages/netmiko/utilities.py", line 347, in wrapper_decorator
            return func(self, *args, **kwargs)
          File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1368, in send_command
            prompt = self.find_prompt(delay_factor=delay_factor)
          File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 1107, in find_prompt
            self.write_channel(self.RETURN)
          File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 436, in write_channel
            self._write_channel(out_data)
          File "/usr/local/lib/python3.8/dist-packages/netmiko/base_connection.py", line 394, in _write_channel
            self.remote_conn.sendall(write_bytes(out_data, encoding=self.encoding))
          File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 846, in sendall
            sent = self.send(s)
          File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 801, in send
            return self._send(s, m)
          File "/usr/local/lib/python3.8/dist-packages/paramiko/channel.py", line 1198, in _send
            raise socket.error("Socket is closed")
        OSError: Socket is closed
        

        结果:

        您的 Cisco 路由器或交换机应该重新加载。

        *Apr 14 08:06:18.842: %SYS-5-RELOAD: cisco 在 vty0 (192.168.30.181) 上请求重新加载。重载原因:重载命令。

        *4 月 14 日 08:06:21.873 请求重新加载

        【讨论】: