私はちょうど Python を学んでいますが、PERL と PHP で約 16 年の経験があります。
ログファイルを追跡しながら、ngrepの出力を取得してPythonを使用してログファイルに書き込もうとしています。オンラインでいくつかの例を見てきましたが、古くて時代遅れに見えるものもあれば、推奨されない 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 に表示することができなかったので、それは私が得た限りです。ログファイルが更新されたときにデータファイルの末尾を確認し、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')