3

私はちょうど 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')
4

1 に答える 1

1

Python で perl コードをエミュレートするには:

#!/usr/bin/env python3
from subprocess import Popen, PIPE

with Popen("ngrep -iW byline".split() + [filter_], stdout=PIPE) as process, \
     open('/path/to/file.log', 'ab') as log_file:
    for line in process.stdout: # read b'\n'-separated lines
        # highlighting, filtering, other function calls
        log_file.write(line)

ngrep変数を渡すプロセスを開始filter_し、Python で変更できるようにしながら、出力をログ ファイルに追加します。Pythonを参照してください: subprocess.communicate() からストリーミング入力を読み取る(バッファリングの問題が発生する可能性があります:オプション likeをngrepサポートしているかどうかを確認し、tail を使用する場合は に渡しライン バッファリング (テキスト モードでのみ使用可能) を有効にするか、呼び出します後)。--line-bufferedgrepfile.logbuffering=1open()log_file.flush()log_file.write(line)

ngrep純粋な Python でもエミュレートできます。


複数のプロセスからの出力を同時に読み取りたい場合 (この場合は ) ngrepたとえばスレッドを使用して async.io をブロックせずにパイプtailを読み取れるようにする必要があります。

于 2016-01-03T01:36:34.013 に答える