2010-02-25 20 views
0

Je veux être en mesure de démarrer et d'arrêter un processus NGREP depuis mon code python. Je n'ai vraiment aucune expérience avec Python au niveau du système.Python et NGREP

Normalement, je lance NGREP à partir de la ligne de commande, mais je voudrais pouvoir l'exécuter à partir d'un script toutes les heures et capturer la trace, puis traiter les résultats.

Quelqu'un peut-il me diriger dans la direction de la façon d'y parvenir. En passant, j'ai juste besoin de pouvoir faire une capture de paquets, peut-être que Python a des capacités intégrées pour cela, peut-être tcpdump?

Merci.

Répondre

0

Rechercher threading.Timer et pexpect. Si vous ne voulez pas installer pexpect, vous pouvez utiliser subprocess.Popen à la place.

EDIT: En réponse au commentaire:

import os 
from signal import SIGTERM, SIGKILL 
os.kill(pid, SIGTERM) #you can also send SIGKILL instead of SIGTERM. 
#You might also have to put this call in a try block and catch OSError 
#Only available on *NIX 

EDIT2: Si vous voulez la main-roll de la capture de paquets, utilisez pypcap. Cela devrait certainement faire ce que vous voulez, puisque tcpdump utilise libpcap lui-même.

+0

Je ne sais pas pourquoi un threading.Timer serait utile dans ce cas. – nosklo

+0

Parce qu'il veut l'exécuter toutes les heures ... Donc, créez un threading.Timer (3600, runNgrep, args, kwargs) 'pour lancer le programme et créer un autre' threading.Timer' quand le programme se termine ... Où 'runNgrep' est une fonction qui prend' args' et 'kwargs' comme arguments, évidemment. –

+0

Ce sont de bonnes suggestions. Une idée de comment tuer le processus si? Je vois les docs. il semble que les méthodes send_signal(), terminate() et exit() ne sont disponibles qu'en python 2.6. J'utilise python 2.5. Suite à votre suggestion, j'utilise subprocess.Popen puis récupère l'identifiant du processus puis exécute subprocess.Popen avec un kill pid pour éditer le processus. Pas si élégant, peut-être il y a une meilleure façon de mettre fin au processus? – Dave

1

Je ne suis pas un expert, mais je ferais ceci:

import subprocess 
import sys 
import re 
import time 

keep_running = 1 #Loop flag 
wait_hours = 12 #Stop for 12 hours and then run again 
run_hours = 1 #We will run ngrep for an hour. The nth run will be dumped to net_log_n.txt 
f_num=0 
hours_so_far=0 
run_time_limit = 100 #Suppose you only want to take a log for 100 hours while you are away. 
while keep_running: 
    ngrep_cmd = "sudo ngrep -ixW > net_log_" + str(fnum) + ".txt &" 
    subprocess.call([ngrep_cmd], shell=True) 
    time.sleep(run_hours*3600) 
    subprocess.call(["sudo killall ngrep"], shell=True) 
    time.sleep(wait_hours*3600) 
    f_num += 1 
    hours_so_far += run_hours 
    if hours_so_far >= run_time_limit: 
     keep_running = 0 

Vous devrez exécuter en tant que root ou avec sudo.

J'espère que ça aide!

+0

Pas besoin de définir 'keep_running' si vous ne le changez jamais, utilisez simplement' while True: '. Votre ligne 'os.system (sudo killall ngrep)' manque de guillemets, et vous devriez * vraiment * utiliser 'subprocess.call' à la place. –

+0

Bonjour Martijn, désolé j'étais maladroit avec la syntaxe et merci pour la correction! Je mets 'keep_running' là pour donner l'idée d'une ligne optionnelle 'if run_hours> 100: keep_running = 0', à Dave. Je suis sur un Mac OS 10.4.11 et j'ai Python 2.3.5, donc je ne pense pas avoir accès au module de sous-processus. – Vandalay

+0

Anciennes versions anciennes, Batman! 2.3 est assez obsolète en effet. –