【问题标题】:Python3 Pyserial and Cisco consolePython3 Pyserial 和 Cisco 控制台
【发布时间】:2019-10-08 05:14:21
【问题描述】:

我已经重用了一些 python 代码来通过串行控制台配置 cisco 交换机。这适用于 Python 2.7 版本,但自从迁移到 Python 3.x 后,它就停止了正常工作。我知道现在需要对字符串进行编码以避免 Pyserial 由于 Python 3 中所做的更改而引发异常错误

“Python 3.0 使用文本和(二进制)数据的概念而不是 Unicode 字符串和 8 位字符串。所有文本都是 Unicode;但是编码的 Unicode 表示为二进制数据。用于保存文本的类型是 str,用于保存数据的类型是字节。”

但是,似乎 cisco 交换机无法识别其发送的数据。

再一次,它在 Python 2.7 上运行良好,但由于 Python 3 的更改,我无法让脚本工作。

def readSerial(self, console):

    dataBytes = console.inWaiting()
    if dataBytes:
        return console.read(dataBytes)

    else:
        return ""
def checkStatus(self, console):

    console.write(str("\r\n\r\n").encode())
    time.sleep(1)

    prompt = self.readSerial(console)
    if str.encode('[yes/no]:') in prompt:
        console.write(str('no \r\n').encode()) # switch is not recognizing the encoded string sent via serial COM4 

        return True
    elif '#' in prompt:
        return True
    elif '>' in prompt:
        return True
    else:
        return False

使用 console.read() 方法,输出显示字符串 'no \r\n' 以字节为单位,但 switch 仍然询问初始设置配置问题:

您想进入初始配置对话框吗? [是/否]:\r\n% 请回答“是”或“否”

不应该这样。它应该初始化用户执行模式">"

有没有人有这种情况的经验?有什么可以分享的经验教训吗?

【问题讨论】:

    标签: python pyserial cisco


    【解决方案1】:

    在我们的项目中我们这样做

    console.write(bytes(input_str, 'ISO-8859-1'))
    

    我相信您将不得不找出您的设备期望的编码。支持的列表可以在https://docs.python.org/3/library/codecs.html#standard-encodings找到。

    【讨论】:

    • 谢谢莉安。我认为问题在于 Cisco CLI 需要一个字符串值并且不知道如何解码它接收的字节值。或者至少对于初始配置对话框问题。它不接受任何已发送的值。但是,如果问题是手动回答脚本能够使用 encode() 方法发送 CLI 命令。
    【解决方案2】:

    此问题是由于对代码的疏忽造成的。

    console.write(str('no \r\n').encode()) # 这个命令有一个额外的空格,这就是 Cisco 交换机没有使用它的原因。

    谢谢

    【讨论】:

      猜你喜欢
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多