如何在ngrep周围编写一个突出显示匹配的包装器?

时间:2008-10-17 22:32:58

标签: python perl unix networking

我刚刚了解了ngrep,这是一个很酷的程序,可让您轻松嗅探与特定字符串匹配的数据包。

唯一的问题是在输出的大块中很难看到匹配。我想编写一个包装器脚本来突出显示这些匹配 - 它可以使用ANSI转义序列:

echo -e 'This is \e[31mRED\e[0m.'

我对Perl最熟悉,但我对Python或任何其他语言的解决方案非常满意。最简单的方法是:

while (<STDIN>) {
   s/$keyword/\e[31m$keyword\e[0m/g;
   print;
}

但是,这不是一个很好的解决方案,因为只要收到不匹配的数据包,ngrep就会打印出没有换行符的哈希标记,上面的代码将禁止打印这些哈希标记,直到脚本看到换行符为止。

有没有办法在不抑制哈希标记即时出现的情况下进行突出显示?

7 个答案:

答案 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并使其打印到stderr的哈希标记要容易得多:

--- 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模块。