2014-05-21 57 views
1

我一直是一個潛伏者,並且已經從我們的網站了解到了幾乎所有我知道的東西。不過,我遇到了一個我一直未能找到解決方案的問題。我正嘗試SSH到思科設備並提取信息。我正在運行'sho接口狀態',它會給出以下輸出:Python - 嘗試在SSH中計算字符串的實例std.out

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個小時。我知道我在這裏錯過了一些東西。

剩下的我唯一能想到的就是EMPTY_PORT是我用來捕獲計數的。

+1

業務的第一階段:將程序分成邏輯分組部分。解析'show interface status'的輸出將是一個。將你在問題中提供的示例輸出複製到一個文本文件中,並使用你的解析函數。那樣有用嗎? –

+0

沿着同樣的路線,將通過SSH執行命令的代碼與其他代碼分開。然後分別測試這些代碼,確保您可以發佈「show interface status」並獲得您期望的原始結果。 –

+0

我唯一遇到的問題就是點數。我可以發出命令並獲得所需的響應。我只是不能像我想要的那樣。 –

回答

1

這是我會怎麼對付計數部:

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 

StringIO僅僅是一個模塊,允許你這樣它的行爲方式就像同一包串一個file object - 像打開文件或網絡響應:你可以從它read(),迭代它等

這允許f或者用樣本數據測試count_notconnected函數,並且只要將實際的response反饋到它就可以了。


你的嘗試不會因爲在這兩種情況下,從工作效應初探你read()所有的數據轉換成字符串一次,然後通過做for line in response1:由字符遍歷該字符串的字符 - line實際上是單個字符。

所以:

  • 迭代一個file object將在換行符boundries拆分爲你,讓你遍歷行。

  • 迭代字符串然而,即使它包含換行符,也會遍歷字符串的字符。

+0

投入生產時無法使上述工作成功。它作爲一個靜態文件工作。我確實找到了一種方法來讓這個工作。 response = str(response) EMPTY_PORT = response.count('notconnect') –