2008-10-17 43 views
2

我剛剛瞭解了ngrep,一個很酷的程序,可以讓你輕鬆地嗅探匹配特定字符串的數據包。我如何在ngrep上編寫一個包含高亮匹配的包裝?

唯一的問題是,它可能很難看到在大塊輸出中的匹配。我想編寫一個包裝腳本來突出這些比賽 - 它可以使用ANSI轉義序列:

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

我最熟悉Perl,但我可以用Python或任何解決方案完全幸福其他語言。最簡單的辦法是這樣的:

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

然而,這不是一個很好的解決方案,因爲的ngrep打印出哈希標記不每當收到一個不匹配的數據包換行符和上面的代碼將打壓印刷這些哈希標記直到腳本看到一個換行符。

有沒有辦法突出顯示而不抑制哈希標記的即時外觀?

回答

3

啊,算了吧。這太痛苦了。這是一個很多更容易得到源的ngrep,並使其打印#號標準錯誤:

--- 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; 
} 
1

如果您有答案this question,這不應該太難。

(本質上說,讀一個字符時,如果它是一個哈希,打印出來。如果它不是一個哈希,保存後打印出的字符。)

+0

嗯,是的 - 我是問這個問題的人!我試圖找出什麼是優雅的方式來做到這一點 - 我應該使用非阻塞I/O? GETC()?我真的需要寫我自己的readline()替換嗎?示例代碼在這裏真的很有用。 – raldi 2008-10-17 23:15:29

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)) 
+0

這會抑制散列標記的即時出現。 – raldi 2008-10-18 05:39:47

3

您也可以通過ack管道輸出。 --passthru標誌將有所幫助。

4

這似乎是個竅門,至少比較兩個窗口,一個運行一個直接的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; 
    } 
} 
+0

好的答案! 值得注意的是,這將把$ keyword當作Perl正則表達式來處理,如果這就是你想要的,這很好。如果我們想將它作爲一個字符串處理,那麼匹配中的(\ Q $ keyword \ E)會這樣做,就像我的$ keyword = quotemeta(shift)或者die ... – pjf 2008-10-18 14:54:47

0

爲什麼不只是使用-q參數調用ngrep來消除散列標記呢?

+0

因爲我喜歡散列標記! – raldi 2009-02-22 04:07:45

相關問題