【问题标题】:Capturing telnet session - pexpect and telnetlib too slow捕获 telnet 会话 - pexpect 和 telnetlib 太慢
【发布时间】:2012-09-20 21:18:47
【问题描述】:

我想从防火墙中提取连接表。在某些情况下,它可能超过 200k 行

“TCP 外部 46.33.77.20:53415 内部 10.16.25.63:80,空闲 0:00:04,字节 3230,标志 UIOB”

等等。

我尝试同时实现 pexpect 和 telnetlib 以获取这些表。不幸的是,超过 40k 的任何东西都会超时和/或死亡。

期望实现:

connect.send("sho conn\n")
connect.expect("<--- More --->", timeout=360)
tmp_txt = connect.before

telnetlib 实现:

telnet.write("sho conn\n")
tmp_text = telnet.read_until("<--- More --->")

有没有更可靠的方法来获取这些信息?我用寻呼机值控制一次给定的行数(在运行它之前)。另外 - 我正在监控防火墙上的 cpu,所以我知道它正在显示连接。要么太多,要么太快,pexpect 或 telnetlib 跟不上。

谢谢。

【问题讨论】:

  • @tMC - 不幸的是,它必须是 telnet,而不是 SSH。
  • 听起来这个防火墙是一个设备,而不是运行 Linux 的标准 PC。这是什么机器?
  • 您是否 100% 确定防火墙实际上正在传送所有数据?也许它的缓冲区溢出了,你永远不会得到更多提示。我会尝试设置寻呼机限制,直到它确实起作用,然后教你的脚本按空格键查看下一页。
  • @NickCraig-Wood - 是的,如果我手动登录设备,将寻呼机设置为 0 并显示表格,它就会全部吐出。我考虑过使用空间方法 - 但无论出于何种原因,防火墙在这样做时会占用更大的 CPU。
  • @tMC - 这是 Cisco ASA(55xx 系列)。我之前希望通过 snmp 获取连接表 - 但可以找到一种方法来获取它。

标签: python pexpect telnetlib


【解决方案1】:

看起来你的方法对我来说很好。我还会分页输出(以保持防火墙 CPU 较低),然后一次将输出捕获一个完整的屏幕。

如果您遇到超时错误,那么为什么不修改您的期望,使其成为一个期望每一行或特定输出行的循环(我认为它具有常规格式),然后仅在获得“更多”时发送空间下一个屏幕的行。我经常使用这种模式来处理可能在不同位置暂停的长输出流。

您提到 python 进程死亡,我们无法帮助您 - 除非您更详细地了解引发的异常。

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多