我正在学习Python,但在PERL和PHP方面有大约16年的经验。
我正在尝试使用Python获取ngrep的输出并将其写入日志文件,同时也要跟踪日志文件。我在网上看到了一些示例,但有些已经过时,而其他一些则使用不被鼓励的shell=True。
在Perl中,我只需使用类似以下内容的命令
#!/usr/bin/perl
open(NGFH,"ngrep -iW byline $filter");
while ($line = <NGFH>) {
open(LOG,">> /path/to/file.log")
// highlighting, filtering, other sub routine calls
print LOG $line
}
我已经让tail工作了,但ngrep没有。我希望能够无限运行并将ngrep的流过滤后输出到日志文件中。我无法让ngrep的输出显示在stdout中,所以这就是我的极限了。我原本期望能够在更新日志文件时看到数据文件tail和ngrep的输出。目前我只是使用bash来运行以下命令。
echo "." >> /path/to/ngrep.log
谢谢!
这是我目前的翻译...
更新 现在似乎可以正常工作了。不过我不知道如何改进它。
import subprocess
import select
import re
log = open('/path/to/ngrep.log','a+',0)
print log.name
n = subprocess.Popen(['ngrep', '-iW', 'byline'],\
stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
p = select.poll()
p.register(n.stdout)
f = subprocess.Popen(['tail','-F','-n','0','/path/to/tailme.log'],\
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p2 = select.poll()
p2.register(f.stdout)
def srtrepl(match):
if match.group(0) == 'x.x.x.x':
# do something
if match.group(0) == 'x.x.y.y':
# do something else
return '\033[92m'+ match.group(0) + '\033[0m'
while True:
if p.poll(1):
line = n.stdout.readline()
s = re.compile(r'(8.8.(4.4|8.8)|192.168.[0-9]{1,3}.[0-9]{1,3})' )
print s.sub( srtrepl, line )
log.write(n.stdout.readline())
if p2.poll(1):
print f.stdout.readline().rstrip('\n')
ngrep
是一个不同的工具 - _"ngrep 是一个 pcap 感知工具,它允许您指定扩展正则表达式来匹配数据包的数据负载"_。 - tdelaneystdout=subprocess.PIPE
,等待ngrep
完成后再杀死tail
。 - tdelaney