如何以编程方式将 Putty 日志转换为人类可读、可搜索的文件?

如何以编程方式将 Putty 日志转换为人类可读、可搜索的文件?

背景: 我有一台 Windows 7 工作站,使用 PuTTY 连接启用了会话日志记录的 Linux 服务器。我以前使用过此Printable output选项,但该选项具有益处没有转义字符,但退税tab如果我使用自动完成功能或者backspace因为我在输入命令时更正了一个(或 3 个)拼写错误,那么我输入的命令将无法搜索。

笔记:我已经cygwin安装了额外的命令行工具支持(即grepfind等等)。

最近,我不得不回去找到一些命令来向同事澄清服务器上发生的事情以及无法查看最终的我发出的命令是有问题的,并且使得搜索日志变得更加困难,并且更难以向我的同事轻易地展示实际发生了什么。

示例 1: 这是“pwd”命令的实际 PuTTY 日志文件,最初拼写错误为“pdw”,然后Printable output在使用cat或 查看时更正为启用的“pwd” less

笔记:less在这种情况下,和之间没有区别,cat因为没有ESC代码并且只捕获了可打印的输出。

$ cat 20151112.170705.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:07:05 =~=~=~=~=~=~=~=~=~=~=~=
[root@eye ~]# pdwwd
/root
[root@eye ~]# exit
logout
$

如您所见,如果您搜索,pwd您将不会得到匹配的结果。我曾在 Mac 上使用过 iTerm,并且知道它可以自动重放日志,似乎应该有一种方法可以查看最终结果我最终使用了它。

输入 PuTTYAll session output日志记录选项。好的,情况是这样的,All session output启用此选项后,日志文件会充斥着ESC终端颜色代码和不可打印字符,例如backspace

示例 #2: 这是“pwd”命令的实际 PuTTY 日志文件,最初拼写错误为“pdw”,然后All session output在查看时更正为启用的“pwd” less

$ less 20151112.170457.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:04:57 =~=~=~=~=~=~=~=~=~=~=~=
Using username "root".
Authenticating with public key "ssh2_rsa_2048_private_key_20111128.ppk"
ESC[?1034hESC]0;root:~^GESC[1;30m[ESC[1;35mrootESC[1;30m@ESC[1;35meye ESC[1;34m~ESC[1;30m]ESC[1;35m# ESC[0mpdESC[ESC[Kwd
/root
ESC]0;root:~^GESC[1;30m[ESC[1;35mrootESC[1;30m@ESC[1;35meye ESC[1;34m~ESC[1;30m]ESC[1;35m# ESC[0mexit
logout
$

好的,我快要遇到实际问题了。如果我使用cat启用All session output选项,它看起来很完美。这正是我想要看到和使​​用的。

示例 3: 这是“pwd”命令的实际 PuTTY 日志文件,最初拼写错误为“pdw”,然后All session output使用查看时更正为“pwd”并启用cat

笔记:这是与上面完全相同的日志文件。这也是我希望能够搜索的确切可见输出和格式。

$ cat 20151112.170457.log
=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2015.11.12 17:04:57 =~=~=~=~=~=~=~=~=~=~=~=
Using username "root".
Authenticating with public key "ssh2_rsa_2048_private_key_20111128.ppk"
[root@eye ~]# pwd
/root
[root@eye ~]# exit
logout

$

我需要解决的真正问题: 我怎么能够以编程方式翻译、转换或更新这些日志文件的内容,以便它们仅有的通过在 PuTTY 会话日志中启用的cat命令处理日志文件后,显示用户实际可见的内容?All session output

需要说明的是,我花了好几个小时研究和测试可能的解决方案。我尝试过的方法没有奏效(或根本没有效果):

  • 直接重定向stdout到名为 test.log 的新文件。test.log 与原始日志文件相同。没有任何好处。
$ cat 20151112.170457.log > test.log
  • 安装 xclip 并将cat输出重定向到xclipxclip程序会报错,因为我不支持 X11。不起作用。没有好处。
$ cat 20151112.170457.log | xclip
Error: Can't open display: (null)
  • 使用内置 Windowsclip命令。当我运行此命令时,操作系统没有任何抱怨,但它却出现了以下两个问题。

    • 没有编程方式从 Windows 剪贴板中获取数据
    • 即使我能取出数据,剪贴板内容也和原始日志文件(带ESC代码)完全相同。没有任何好处。
  • 我确实有一台 Mac,而且我读过的一些其他帖子也建议使用它,pbcopy但我怀疑它的工作方式与 Windows 上的“剪辑”有何不同。

  • 我知道并且已经使用过less -Rless -r来处理终端颜色ESC代码(使用-R)和所有ESC代码(使用),但是,这仅有助于向用户展示,并且如果我在按下之前犯了错误并进行了更正,-r则不允许以编程方式搜索命令的数百个日志文件。pwdEnter

  • 我也和同事谈过了。没什么好处。;-)

本质上,我只是想要 PuTTY 日志相当于将网页复制/粘贴到记事本中。网页源代码有很多<html>标签,但用户看不到任何标签,如果他们突出显示页面,单击copypaste进入记事本,他们得到的只是他们在页面上看到的文本。

我希望能够以编程方式创建所有这些 PuTTY 日志文件的记事本等效版本,以便进行有效搜索(即使用grep)。

笔记:如果从我的 StackExchange 总体声誉来看1,这是我在 StackExchange 网站上的第一个问题或帖子。我正在寻找有用的答案,而不是像“切换到 Linux”或“RTFM”这样的回应。

答案1

假设 putty 文件中的转义码是二进制的(我有点困惑为什么你的例子有控制字符 - 我猜是 less 做的),你可以尝试 col

http://man7.org/linux/man-pages/man1/col.1.html

col 能够理解的托架运动控制序列及其十进制值如下表所列:

          ESC-7             reverse line feed (escape then 7)
          ESC-8             half reverse line feed (escape then 8)
          ESC-9             half forward line feed (escape then 9)
          backspace         moves back one column (8); ignored in the
                            first column
          newline           forward line feed (10); also does carriage
                            return
          carriage return   (13)
          shift in          shift to normal character set (15)
          shift out         shift to alternate character set (14)
          space             moves forward one column (32)
          tab               moves forward to next tab stop (9)
          vertical tab      reverse line feed (11)

答案2

我在记录 putty 会话时遇到了同样的问题,并且在网上也找不到任何解决方案,所以我最终编写了一个小型 python 脚本来读取会话日志并清理它。

file_in=open('input.log')
file_out=open('output.log', 'w')

for line in file_in:
    input_line = bytearray(line, 'utf-8')

    input_line=input_line.replace(b"\x1b[J", b'')       #remove \x1b[J
    input_line=input_line.replace(b"\x1b[20D", b'')     #remove \x1b[20D
    input_line=input_line.replace(b"\x1b[H", b'')       #remove \x1b[H
    input_line=input_line.replace(b"\x1b[0m", b'')      #remove \x1b[0m
    input_line=input_line.replace(b"\x1b[0;0m", b'')    #remove \x1b[0;0m
    input_line=input_line.replace(b"\x1b[1;32m", b'')   #remove \x1b[1;32m
    input_line=input_line.replace(b"\x1b[1;34m", b'')   #remove \x1b[1;34m
    input_line=input_line.replace(b"\x1b[1;35m", b'')   #remove \x1b[1;35m
    input_line=input_line.replace(b"\x1b[1;36m", b'')   #remove \x1b[1;36m
    input_line=input_line.replace(b"\x1b[1m", b'')      #remove \x1b[1m
    input_line=input_line.replace(b"\x07", b'')         #remove \x07 (BEL)

    p = input_line.find(b"\x08")
    while p>0:                          #apply backspace and remove 'BS'
        del input_line[p]
        del input_line[p-1]
        p = input_line.find(b"\x08")

    file_out.write(input_line.decode())

file_in.close
file_out.close

这对我的日志有用。因此启用“所有会话输出”,尝试一下并告诉我。

顺便说一下,这是 Python 3.5.1。

答案3

我在寻找相同问题的答案时看到了您的帖子。您说如果您 cat 该文件,它看起来就很完美。我在 CYGWIN 中使用 cat 将文件打印到 CYGWIN 终端,然后选择所有内容并将其粘贴到 NotePad++ 文件中。它工作得很好。

相关内容