【问题标题】:How can I write a wrapper around ngrep that highlights matches?如何围绕 ngrep 编写一个突出显示匹配项的包装器?
【发布时间】:2010-09-17 20:41:49
【问题描述】:

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

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

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

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

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

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

有什么方法可以在不抑制主题标记的即时出现的情况下进行突出显示?

【问题讨论】:

    标签: python perl unix networking


    【解决方案1】:

    这似乎可以解决问题,至少比较两个窗口,一个运行直接的 ngrep(例如,ngrep 什么),另一个通过管道传输到以下程序(使用 ngrep 不管 | ngrephl 目标字符串)。

    #! /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;
        }
    }
    

    【讨论】:

    • 不错的答案!值得注意的是,这会将 $keyword 视为 Perl 正则表达式,如果这是您想要的,这很好。如果我们想将其视为文字字符串,则匹配中的 (\Q$keyword\E) 将执行此操作, my $keyword = quotemeta(shift) 或 die ...
    【解决方案2】:

    啊,算了。这太痛苦了。将源获取到 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;
    }
    

    【讨论】:

      【解决方案3】:

      您还可以通过ack 管道输出。 --passthru 标志会有所帮助。

      【讨论】:

        【解决方案4】:

        如果你有答案this question应该不会太难。

        (本质上,一次读取一个字符,如果是散列,则打印它。如果不是散列,则保存字符以便稍后打印。)

        【讨论】:

        • 嗯,是的——我就是提出这个问题的人!我试图弄清楚这样做的优雅方法是什么——我应该使用非阻塞 I/O 吗?获取()?我真的需要编写自己的 readline() 替换吗?示例代码在这里会很有帮助。
        【解决方案5】:

        这在 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))
        

        【讨论】:

          【解决方案6】:

          为什么不直接调用带有 -q 参数的 ngrep 来消除哈希标记?

          【讨论】:

            【解决方案7】:

            请参阅this post to Linux-IL where someone asked a similar question 的脚本。它是用 Perl 编写的,并使用 CPAN Term::ANSIColor 模块。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-12
              • 1970-01-01
              相关资源
              最近更新 更多