背景:我有一个Windows 7工作站,并使用PuTTY实现与Linux服务器的SSH连接,并启用会话logging。 我以前使用的Printable output
选项,但是有没有转义字符的好处 ,但制作命令我input不可检索的缺点 ,如果我使用tab
自动完成或backspace
因为我纠正了一个错字(或3),因为我input命令。
注:我有cygwin
安装额外的命令行工具支持(即grep
, find
等)。
最近,我不得不回过头去找一些命令,直接与同事build立关于服务器上发生的事情的logging,并且无法看到我发出的最终命令是有问题的,并且使得更难以search日志以及要更容易地certificate我的同事实际上发生了什么。
示例#1:这是一个实际的PuTTY日志文件,其中pwd命令最初拼写错误为“pdw”,然后在使用cat
或less
查看时Printable output
启用时更正为“pwd”。
注意:在这种情况下, cat
和cat
之间没有区别,因为没有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
cat
输出redirect到xclip
。 xclip
程序抱怨,因为我没有X11的支持。 没有工作。 没有好处。 $ cat 20151112.170457.log | xclip Error: Can't open display: (null)
使用内置的Windows clip
命令。 当我运行这个命令时没有任何操作系统的抱怨,但是下面有两个问题。
ESC
代码)相同。 没有好处。 我有一个Mac和我读的其他一些postbuild议使用pbcopy
但我怀疑它会工作任何不同于“剪辑”在Windows上。
我知道并使用less -R
和less -r
来允许处理terminal颜色ESC
代码(使用-R
)和所有ESC
代码(使用-r
),但是,这仅仅有助于呈现给用户,并且如果我犯了一个错误,并且在按Enter
之前纠正它,不允许编程search数百个用于命令pwd
的日志文件。
我也和同事谈过了。 没有好处。 😉
实质上,我只是想将PuTTY日志等同于将网页的复制/粘贴到记事本中。 网页源代码有很多<html>
标签,但用户没有看到任何内容,如果他们突出显示页面,点击copy
并paste
到记事本中,他们所得到的就是他们在页面上看到的文本。
我希望能够以编程方式创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。