2012-08-02 6 views
5

Estoy usando tcpflow para registrar el tráfico de red en un servidor. Quiero registrar estos datos en un archivo, pero no en todos de él. El proceso de monitoreo se ejecutará en segundo plano como daemon indefinidamente.¿Cómo preprocesamos una secuencia de texto infinita antes de escribirla en un archivo?

Algunas líneas de la secuencia incluyen un conteo de bytes, y si veo ese conteo de bytes (digamos, 800 bytes), entonces necesito registrar los siguientes 800 bytes en el archivo. Si no, deseo no escribir en el archivo.

¿Cuál es la mejor manera para mí de hacer este tipo de "preprocesamiento sobre la marcha" de la transmisión para decidir qué redirigir al archivo de registro? ¿Algún tipo de secuencia de comandos de segundo daemon que está escuchando la transmisión, que se conecta con esa secuencia de comandos?

Ejemplo:

I ver la línea siguiente en la corriente:

1343932842: 010.079.091.189.35856-010.104.001.199.11211: set i:1:20163484235 0 0 1429

Primero, necesito para comprobar que tiene un "set". Luego, examino la última parte de la línea (1429), luego leo los siguientes 1429 bytes y los escribo en un archivo.

+0

Parece flujo TCP soporta expresiones de filtro como tcpdump – jordanm

+0

@jordanm no creo que me ayudará. Aquí hay una línea de ejemplo: '1343932842: 010.079.091.189.35856-010.104.001.199.11211: establecer i: 1: 20163484235 0 0 1429' Necesito ver primero que la línea tiene un "conjunto", luego examinar la última parte de la línea (1429), luego leer los siguientes 1429 bytes y escribirlos en un archivo. – Tim

+0

¿en qué idioma estás escribiendo esto? ¿En qué ambiente se está ejecutando esto? Las etiquetas "bash" y "php" son confusas ... – tucuxi

Respuesta

1

Sí, utilice un programa daemon que tome la transmisión como entrada, y haga exactamente lo que usted describió. Recomendaría C en lugar de una secuencia de comandos, ya que tiene una entrada/salida muy directa y muy poca sobrecarga.

Asumiendo que tiene un ejecutable llamado 'captura' y un programa de filtrado llamado 'filtro', se les puede encadenar de una cáscara del golpe usando

bash-prompt$ capture capture-params | filter 

Cualquier cosa que capture escribe en la salida estándar estará disponible para filter como entrada desde stdin. Es una cuestión simple, desde el punto de vista del filtro, de las líneas de lectura, y cuando se encuentra el patrón de fin ... tamaño, escribiendo la salida en un archivo de salida (o de nuevo en stdout). Si se escribe a una salida estándar, que puede redirigir a un archivo usando

bash-prompt$ capture capture-params | filter > output-file.txt 
+0

¿Cómo engancho los dos? ¿Tengo un segundo programa C para hacer una llamada al intérprete de órdenes para iniciar el primer programa que genera la secuencia? ¿Tengo el primer programa escrito en un archivo temporal, que lee el segundo programa? (Preferiría no usar esa solución). – Tim

+0

Agregué algunos ejemplos de encadenamiento usando bash. Esta es una "manera de hacer las cosas en unix": los programas pequeños que hacen cosas simples se compilan en programas más grandes. – tucuxi

+0

Gracias por eso. Entonces, ¿el programa "filtro" sería un programa C que es básicamente un ciclo infinito, leyendo repetidamente stdin, analizando/procesando y escribiendo en stdout? ¿El programa de filtro debe compilarse en C? ¿Puede ser solo un script PHP? – Tim

0

Usted puede conseguir en el procesamiento de texto marcha con awk. Necesitará aprender el idioma pero lo uso para tareas similares en el análisis de registro en vivo. Hago tail -f file.log | awk -f myscript.awk

Cada línea se analizará a través de la secuencia de comandos awk crear y con if-then-else, se pueden detectar algunas palabras presentes en esa línea y activando otras partes del código awk para analizar la línea de manera diferente o incluso ejecutar programas externos.

0

Por mucho, la aplicación más elegante para lo que está describiendo es utilizar una base de datos de uso general de poco uso. RRDtool es el estándar de la industria OpenSource, registro de datos de alto rendimiento y gráficos.

Usando un comando bash puede ingresar sus datos en la base de datos, y si lo desea, graficarlo también es muy simple.

VER: http://oss.oetiker.ch/rrdtool/gallery/index.en.html

Cuestiones relacionadas