Python试图在SSH中计算字符串的实例数标准ou

2024-07-05 14:53:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经潜伏了一段时间,几乎从这个网站学到了我所知道的一切。然而,我遇到了一个问题,我还没有找到一个解决办法。我试图SSH到思科设备和拉信息。我正在运行“sho interface status”,它将给出以下输出:

 Port    Name               Status       Vlan       Duplex Speed Type
 Fa0                        connected    1          a-full   a-100 10/100BaseTX
 Fa1                        notconnect   1            auto    auto 10/100BaseTX
 Fa2                        connected    1          a-full   a-100 10/100BaseTX
 Fa3                        notconnect   313          auto    auto 10/100BaseTX
 Fa4                        notconnect   1            auto    auto 10/100BaseTX
 Fa5                        notconnect   1            auto    auto 10/100BaseTX
 Fa6                        connected    1          a-full   a-100 10/100BaseTX
 Fa7                        connected    1          a-full   a-100 10/100BaseTX"

我正在计算有多少行包含文本“notconnect”。我尝试了很多不同的方法,要么得到235,要么得到0。下面是一个当我得到奇怪的数字时我正在尝试的例子:

            stdin, stdout, stderr = dssh.exec_command('show interface status')
            response1 = stdout.read()
            if 'notconnect' in response1:
                            EMPTY_PORT = 0
                            for line in response1:
                                            if line.strip() and line[0]!='connected':

这是我在得到0的响应时尝试的:

            stdin, stdout, stderr = dssh.exec_command('sho int status')
            response = stdout.read()
            if 'notconnect' in response:
                data = stdout.read()
                count = data.count('not')
                EMPTY_PORT = count
                for line in response:
                        count = count + line.count("not")

我真的希望你们能帮助我朝着正确的方向前进。我已经花了将近6个小时在同一段剧本上。我知道我错过了一些东西。你知道吗

我唯一能想到的是空的端口是我用来捕获计数的。你知道吗


Tags: inreadautoifresponsestatuscountstdout
1条回答
网友
1楼 · 发布于 2024-07-05 14:53:24

这就是我如何处理计数部分:

from StringIO import StringIO

RAW_RESPONSE = """\
Port    Name               Status       Vlan       Duplex Speed Type
Fa0                        connected    1          a-full   a-100 10/100BaseTX
Fa1                        notconnect   1            auto    auto 10/100BaseTX
Fa2                        connected    1          a-full   a-100 10/100BaseTX
Fa3                        notconnect   313          auto    auto 10/100BaseTX
Fa4                        notconnect   1            auto    auto 10/100BaseTX
Fa5                        notconnect   1            auto    auto 10/100BaseTX
Fa6                        connected    1          a-full   a-100 10/100BaseTX
Fa7                        connected    1          a-full   a-100 10/100BaseTX
"""


def count_notconnected(response):
    counter = 0
    for line in response:
        if 'notconnect' in line:
            counter += 1
    return counter


response = StringIO(RAW_RESPONSE)
print count_notconnected(response)

输出:

4

^{}只是一个模块,它允许您包装一个字符串,使它的行为与file object类似于打开的文件或网络响应:您可以从中read()遍历它,等等

这样就可以用样本数据测试count_notconnected函数,并且只要在它工作后向它输入一个真正的response。你知道吗


您的尝试不起作用,因为在这两种情况下,您都会将响应中的所有数据一次read()转换为一个字符串,然后通过执行for line in response1:-line逐字符遍历该字符串实际上是一个字符。你知道吗

所以:

  • 迭代file object将在换行边界处为您拆分它,并允许您迭代行。

  • 但是,对字符串进行迭代,即使它包含换行符,也会对字符串的字符进行迭代。

相关问题 更多 >