如何以编程方式将腻子日志转换为可读的可search文件?

背景:我有一个Windows 7工作站,并使用PuTTY实现与Linux服务器的SSH连接,并启用会话logging。 我以前使用的Printable output选项,但是有没有转义字符的好处 ,但制作命令我input不可检索的缺点 ,如果我使用tab自动完成或backspace因为我纠正了一个错字(或3),因为我input命令。

注:我有cygwin安装额外的命令行工具支持(即grepfind等)。

最近,我不得不回过头去找一些命令,直接与同事build立关于服务器上发生的事情的logging,并且无法看到我发出的最终命令是有问题的,并且使得更难以search日志以及要更容易地certificate我的同事实际上发生了什么。

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

注意:在这种情况下, catcat之间没有区别,因为没有ESC代码,只有可打印的输出被捕获。

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

正如你所看到的,如果你要searchpwd你将得不到匹配的结果。 我在Mac上使用了iTerm,知道它可以自动重播日志,而且看起来应该有办法看到我最终使用的最终结果

inputPuTTY All session output日志logging选项。 好吧,这是交易,启用All session output选项,日志文件被淹没与terminal颜色的ESC代码和不可打印的字符,如backspace

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

 $ 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 $ 

好吧,所以我几乎是真正的问题。 如果我启用All session output选项使用cat ,它看起来很完美。 这正是我想看到和工作。

示例#3:这是一个实际的PuTTY日志文件,其中pwd命令初始拼写错误为“pdw”,然后在使用cat查看时启用了All session output后更正为“pwd”。

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

 $ 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 $ 

我需要解决的真正问题:如何 编程方式转换,转换或更新这些日志文件的内容,以便在通过cat命令处理日志文件后, 显示用户实际可见的内容。 PuTTY会话logging?

为了logging,我花了超过几个小时研究和testing可能的解决scheme。 我已经尝试过的东西没有适当的工作(或根本):

  • stdout直接redirect到一个名为test.log的新文件。 test.log与原始日志文件相同。 没有好处。
 $ cat 20151112.170457.log > test.log 
  • 安装xclip并将cat输出redirect到xclipxclip程序抱怨,因为我没有X11的支持。 没有工作。 没有好处。
 $ cat 20151112.170457.log | xclip Error: Can't open display: (null) 
  • 使用内置的Windows clip命令。 当我运行这个命令时没有任何操作系统的抱怨,但是下面有两个问题。

    • 没有编程的方式来从Windows剪贴板中获取数据
    • 即使我可以获取数据,剪贴板内容也与原始日志文件(使用ESC代码)相同。 没有好处。
  • 我有一个Mac和我读的其他一些postbuild议使用pbcopy但我怀疑它会工作任何不同于“剪辑”在Windows上。

  • 我知道并使用less -Rless -r来允许处理terminal颜色ESC代码(使用-R )和所有ESC代码(使用-r ),但是,这仅仅有助于呈现给用户,并且如果我犯了一个错误,并且在按Enter之前纠正它,不允许编程search数百个用于命令pwd的日志文件。

  • 我也和同事谈过了。 没有好处。 😉

实质上,我只是想将PuTTY日志等同于将网页的复制/粘贴到记事本中。 网页源代码有很多<html>标签,但用户没有看到任何内容,如果他们突出显示页面,点击copypaste到记事本中,他们所得到的就是他们在页面上看到的文本。

我希望能够以编程方式创build相当于所有这些PuTTY日志文件的记事本以进行有效的search(即使用grep )。

注意:如果从我的总StackExchange声誉不明显,这是我的第一个问题或发布在StackExchange网站上。 我正在寻找有用的答案,而不是像“切换到Linux”或“RTFM”的响应。

假设腻子文件中的转义码是二进制的(我有点困惑,为什么你的例子有控制字符 – 即时猜测较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) 

我有同样的问题login腻子会话,也找不到任何解决scheme,所以我写了一个小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。