【问题标题】:How to connect serial port using netmiko?如何使用netmiko连接串口?
【发布时间】:2018-02-13 04:55:15
【问题描述】:

我正在尝试连接到串行端口(COM7),但似乎无法正常工作。 也许我在设备中做了错误的描述。 谁能帮帮我?

from __future__ import absolute_import, division, print_function
import netmiko

device = {
"device_type": "cisco_ios_serial",
"port": "COM7",
"username": "admin",
"password": "",
"secret": "secret"
}

conn = netmiko.ConnectHandler(**device)
conn.enable()
output = conn.send_config_set([
        'no service dhcp',
        'service dhcp',
        'ip dhcp option format circuit_id',
        'attr 3 type 0 length-hidden 6 value string 2412533'])
print(output)
conn.disconnect()

这是错误

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    conn = netmiko.ConnectHandler(**device)
  File "C:\Python\Python27\lib\site-packages\netmiko\ssh_dispatcher.py", line 173, in ConnectHandler
    return ConnectionClass(*args, **kwargs)
  File "C:\Python\Python27\lib\site-packages\netmiko\base_connection.py", line 117, in __init__
    self.port = int(port)
ValueError: invalid literal for int() with base 10: 'COM7'

【问题讨论】:

  • 看来端口应该只是一个数字。

标签: python networking


【解决方案1】:

串行设置在设备定义的 serial_settings 中指定。

device = {
"device_type": "cisco_ios_serial",
"username": "admin",
"password": "",
"secret": "secret",
"serial_settings": {"port": "COM7"}
}

我没有要测试的串行设备,但在寻找 COM 端口时出错。

ValueError: device COM7 not found.

而不是期待一个整数。

来自 netmiko 源的 serial_settings 的默认值为:

    self.serial_settings = {
        'port': 'COM1',
        'baudrate': 9600,
        'bytesize': serial.EIGHTBITS,
        'parity': serial.PARITY_NONE,
        'stopbits': serial.STOPBITS_ONE
    }

来自https://github.com/ktbyers/netmiko/blob/develop/netmiko/base_connection.py

【讨论】:

    【解决方案2】:

    感谢您提供使用 serial_settings 的想法。 但是,下面的 serial_settings 还有一些其他错误; 仅供参考,我可以使用 USB 控制台访问 COM7,但出现错误。

    Traceback (most recent call last):
      File "d:\Programming\GTAC\test_automation\test\robot_test\test.py", line 15, in <module>
        conn = netmiko.ConnectHandler(**device)
      File "C:\Python\Python27\lib\site-packages\netmiko\ssh_dispatcher.py", line 173, in ConnectHandler
        return ConnectionClass(*args, **kwargs)
      File "C:\Python\Python27\lib\site-packages\netmiko\base_connection.py", line 146, in __init__
        comm_port = check_serial_port(comm_port)
      File "C:\Python\Python27\lib\site-packages\netmiko\utilities.py", line 173, in check_serial_port
        return cdc.split()[0]
    AttributeError: 'ListPortInfo' object has no attribute 'split'
    

    【讨论】:

      【解决方案3】:

      check_serial_port 函数中存在试图拆分 ListPortInfo 对象的错误。 快速解决方案是这样的猴子补丁:

      import netmiko
      import serial.tools.list_ports
      
      def my_check_serial_port(name):
          """returns valid COM Port."""
          try:
              cdc = next(serial.tools.list_ports.grep(name))
              return cdc.__str__().split()[0]
          except StopIteration:
              msg = "device {} not found. ".format(name)
              msg += "available devices are: "
              ports = list(serial.tools.list_ports.comports())
              for p in ports:
                  msg += "{},".format(str(p))
              raise ValueError(msg)
      
      netmiko.base_connection.check_serial_port = my_check_serial_port
      

      【讨论】:

        猜你喜欢
        • 2021-10-10
        • 1970-01-01
        • 2022-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-10-26
        • 1970-01-01
        • 2017-03-14
        • 2021-08-04
        相关资源
        最近更新 更多