python - 如何使用 Python 从 telnet 响应中读取一行?

标签 python python-3.x telnet python-3.3 telnetlib

我很惊讶我在这里找不到这个问题。

我想从 telnet 响应中提取一行并将其设为变量。 (实际上是该行中的一个数字)。我可以使用 telnet.read_until() 提取到我需要的位置,但整个开始仍然存在。打印输出显示机器的不同状态。

我试图获取的行格式如下:

CPU Utilization          : 5 %

我真的只需要数字,但输出的其余部分中有很多“:”和“%”字符。谁能帮我提取这个值?提前致谢!

这是我的代码(读取整个输出并打印):

import telnetlib, time


print ("Starting Client...")
host    = input("Enter IP Address: ")
timeout = 120

print ("Connecting...")
try:
    session = telnetlib.Telnet(host, 23, timeout)
except socket.timeout:
    print ("socket timeout")
else:
    print("Sending Commands...")
    session.write("command".encode('ascii') + b"\r")
    print("Reading...")
    output = session.read_until(b"/r/n/r/n#>", timeout )
    session.close()
    print(output)
    print("Done")

编辑:一些输出示例:

Boot Version         : 1.1.3 (release_82001975_C)
Post Version         : 1.1.3 (release_82001753_E)
Product VPD Version  : release_82001754_C
Product ID           : 0x0076
Hardware Strapping   : 0x004C
CPU Utilization      : 5 %
Uptime               : 185 days, 20 hours, 31 minutes, 29 seconds
Current Date/Time    : Fri Apr 26 17:50:30 2013

最佳答案

正如你在问题中所说:

I can extract up to where I need using telnet.read_until(), but the whole beginning is still there.

因此,您可以将所有行(包括您想要的行)放入变量 output 中。您唯一缺少的是如何获取 output 字符串的最后一行,对吧?

这很简单:只需将 output 分成几行并取最后一行:

output.splitlines()[:-1]

或者只是拆分最后一行:

output.rpartition('\n')[-1]

这不会改变输出,它只是一个计算新值的表达式(output 的最后一行)。所以,只是这样做,然后是 print(output),不会做任何明显有用的事情。

让我们举一个更简单的例子:

a = 3
a + 1
print(a)

这显然会打印 3。如果你想打印 4,你需要这样的东西:

a = 3
b = a + 1
print(b)

所以,回到真实的例子,你想要的大概是这样的:

line = output.rpartition('\n')[-1]
print(line)

现在你会看到这个:

CPU Utilization          : 5 %

当然,您仍然需要类似 Johnny 的代码来从该行的其余部分中提取数字:

numbers = [int(s) for s in line.split() if s.isdigit()]
print(numbers)

现在你会得到这个:

['5']

请注意,它为您提供了一个字符串列表。如果你只想要一个字符串,你还有另一个步骤:

number = numbers[0]
print(number)

这给了你:

5

最后,number 仍然是 string '5',而不是整数 5。如果需要,请将最后一位替换为:

number = int(numbers[0])
print(number)

这仍然会打印出 5,但现在您有了一个可以实际用作数字的变量:

print(number / 100.0) # convert percent to decimal

我依赖于 telnet defines end-of-line as \r\n 的事实,并且任何错误的 telnet 兼容服务器几乎肯定会使用 Windows 风格(也 \r\n)或 Unix 风格(只是 \n ) 行结尾。因此,在 \n 上拆分总是会得到最后一行,即使是对于古怪的服务器也是如此。如果您不需要担心额外的稳健性,您可以在 \r\n 而不是 \n 上拆分。


还有其他方法可以解决这个问题。我可能会使用 session.expect([r'CPU Utilization\s*: (\d+)\s*%']) 之类的东西,或者将 session 包装为行的迭代器(如一个文件),然后编写标准的 itertools 解决方案。但鉴于您已经拥有的东西,这似乎是最简单的。

关于python - 如何使用 Python 从 telnet 响应中读取一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243716/

相关文章:

Python访问具有动态获取的列名的单元格

python - 如何使用 DataFrame 比较两个 CSV 文件并检索不同的单元格?为什么浮点单元格中会出现这么多小数位?

connection - telnet 问题 :Connecting To localhost. ..无法在端口 11211 上打开与主机的连接:连接失败

python - 整个程序内的延迟打印

python - 获取 SQLAlchemy ORM 类的模式名称

python - mac 上的 pyicu : ./common.h:38:13: 错误:未知类型名称 'decltype'

c++ - 如何使用 Telnet 库从服务器发送查询并从客户端接收回显

go - 如何从 Telnet session 读取数据

python - 如何随机交换选择列的值?

python - 在循环中应用 `lambda` 和 `map`?