我刚刚了解了ngrep,这是一个很酷的程序,可让您轻松嗅探与特定字符串匹配的数据包。
唯一的问题是在输出的大块中很难看到匹配。我想编写一个包装器脚本来突出显示这些匹配 - 它可以使用ANSI转义序列:
echo -e 'This is \e[31mRED\e[0m.'
我对Perl最熟悉,但我对Python或任何其他语言的解决方案非常满意。最简单的方法是:
while (<STDIN>) {
s/$keyword/\e[31m$keyword\e[0m/g;
print;
}
但是,这不是一个很好的解决方案,因为只要收到不匹配的数据包,ngrep就会打印出没有换行符的哈希标记,上面的代码将禁止打印这些哈希标记,直到脚本看到换行符为止。
有没有办法在不抑制哈希标记即时出现的情况下进行突出显示?
答案 0 :(得分:4)
这似乎可以解决这个问题,至少比较两个窗口,一个运行一个直接的ngrep(例如ngrep无论如何),另一个用管道连接到下面的程序中(使用ngrep无论| ngrephl target-string)。
#! /usr/bin/perl
use strict;
use warnings;
$| = 1; # autoflush on
my $keyword = shift or die "No pattern specified\n";
my $cache = '';
while (read STDIN, my $ch, 1) {
if ($ch eq '#') {
$cache =~ s/($keyword)/\e[31m$1\e[0m/g;
syswrite STDOUT, "$cache$ch";
$cache = '';
}
else {
$cache .= $ch;
}
}
答案 1 :(得分:3)
--- ngrep.c 2006-11-28 05:38:43.000000000 -0800
+++ ngrep.c.new 2008-10-17 16:28:29.000000000 -0700
@@ -687,8 +687,7 @@
}
if (quiet < 1) {
- printf("#");
- fflush(stdout);
+ fprintf (stderr, "#");
}
switch (ip_proto) {
然后,过滤是小菜一碟:
while (<CMD>) {
s/($keyword)/\e[93m$1\e[0m/g;
print;
}
答案 2 :(得分:3)
您还可以通过ack管道输出。 --passthru标志会有所帮助。
答案 3 :(得分:1)
如果你有答案this question,那应该不会太难。
(基本上,一次读取一个字符,如果它是一个哈希值,则打印它。如果它不是哈希值,请保存该字符以便稍后打印出来。)
答案 4 :(得分:0)
这在python中很容易。
#!/usr/bin/env python
import sys, re
keyword = 'RED'
while 1:
c = sys.stdin.read(1)
if not c:
break
if c in '#\n':
sys.stdout.write(c)
else:
sys.stdout.write(
(c+sys.stdin.readline()).replace(
keyword, '\x1b[31m%s\x1b[0m\r' % keyword))
答案 5 :(得分:0)
为什么不直接使用-q参数调用ngrep来消除哈希标记?
答案 6 :(得分:-1)
请参阅this post to Linux-IL where someone asked a similar question处的脚本。它是用Perl编写的,使用CPAN Term :: ANSIColor模块。