Dosya bulucu betik örneği (Multithread)

Başlatan risperdal, 01 Haziran 2010 - 20:33:35

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

risperdal

Betiğimiz verilen regex(Düzenli ifade)'i, verdiğiniz dizin içerisindeki verdiğiniz uzantıyla eşleşen dosyalarda(alt klasörler dahil) arıyor. Eğer dosya içerisinde verilen regexp bulunmuşsa hangi satırda ve hangi karakterler arasında bulunduğunu söylüyor. Ve istenilirse sonuçlar log dosyasına yazdırıyor. Betiğimizde multithread kullandım. MultiThread kullanımı için çok güzel bir örnek oldu sanıyorum.

Betikten bir görüntü.



#!/usr/bin/env python
# -*- coding: utf-8 -*-

#Coded by h4ckinger
#Blog :www.h4ckinger.org
#Contact:h4ckinger gmail com
import os,re,sys
from threading import Thread
from optparse import OptionParser

log=None

class calistir(Thread):
def __init__(self,anaklasor,dosyalistesi,aranacak):
Thread.__init__(self)
self.dosyalistesi =dosyalistesi    #file list
self.anaklasor =anaklasor #current scanning dir
self.aranacak =aranacak #regex pattern

def run(self):
logmsg("\n\n[+] Current dir -> %s" % self.anaklasor)
for dosyamiz in self.dosyalistesi:
if not os.access(os.path.join(self.anaklasor,dosyamiz),os.R_OK):
logmsg("\n[-]%s doesnt have permissions to read %s" % (os.getenv("USERNAME"),dosyamiz))
continue
fp=open(os.path.join(self.anaklasor,dosyamiz),"r+")
satirlar=map(lambda line:line.rstrip(),fp.readlines())
#[x.rstrip() for x in opener.readlines()]
say=1
for tek_satir in satirlar:
bul=re.search(self.aranacak,tek_satir)
if bul:
logmsg("[+] Found in %s line %d [char = %s] - string:%s" % (dosyamiz,say,str(bul.span()),bul.group(0)))
say+=1
fp.close()

def about():
return """#Python Example Projects - Project 3 - Multi Threaded File Content Scanner
#Coded by h4ckinger

  """

def clear():
sil="clear" if (sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin') else "cls"
os.system(sil)

def list_dirs(klasor,uzanti):
dosyalar=[]
for root, dirs, files in os.walk(klasor):
for x in files:
if x.endswith(tuple(uzanti.split(","))):
dosyalar.append([root,x])
return dosyalar

def logmsg(msg):
global log
print msg
if log:
log.write(msg+os.linesep)

def main():
global log

kullanim="python %prog [options]\n\n./%prog -p /home/"+os.getenv("USERNAME")+" -r [0-9a-f]{32} -e .html,.php -o scan.txt\n\nExample search md5 pattern in html and php files.\nAfter scan save output to scanlog.txt"
optparser = OptionParser(description=about(),usage=kullanim,version="%prog version 1.0")
optparser.add_option("-p", "--path",type="string",action="store",dest="path",help="Define root path to scan", metavar="/path/to/scan")
optparser.add_option("-r", "--regex",type="string",action="store", dest="regex",help="Define regex pattern to search",metavar="Regular Expression")
optparser.add_option("-e", "--extensions",type="string",action="store", dest="extensions",help="Define extension which will be scanned(would be more than one seperate with \",\")",metavar=".html,.php,.txt")
optparser.add_option("-o", "--output",type="string",action="store", dest="output",help="Save results log file(OPTIONAL)",metavar="FILE")

(options, args) = optparser.parse_args()



if not options.path or not options.regex or not options.extensions:
clear()
optparser.print_help()
sys.exit(0)
if not os.path.isdir(options.path):
print "[-]%s is not valid path" % options.path
sys.exit(0)
if not os.access(options.path,os.R_OK):
print "[-]%s doesnt have permission on that directory" % os.getenv("USERNAME")
sys.exit(0)

if options.output:
log=open(options.output,"w")

tara=options.path #path
ara=options.regex #regex
uzantilar=options.extensions#extensions
logmsg("[+] Listing files in root directory -> %s" % tara)
sozluk=list_dirs(tara,uzantilar)
logmsg("[+] Listing finished. Creating threads")
ilk_klasor=sozluk[0][0]
fazlami=any([True for x in range(len(sozluk)) if sozluk[x][0]!=sozluk[0][0]])# birden fazla klasor varmi
threadlist=[]
tmpdosyalar=[]
logmsg("[+] Scanning content in files")

for k in sozluk:
dizin,adi=k
tmpdosyalar.append(adi)
if not fazlami and k==sozluk[len(sozluk)-1]:
tek_baslat=calistir(ilk_klasor,tmpdosyalar,ara)
tek_baslat.start()
if ilk_klasor!=dizin:
tek_thread=calistir(ilk_klasor,tmpdosyalar,ara)
tek_thread.start()
threadlist.append(tek_thread)
tmpdosyalar=[]
ilk_klasor=dizin

for thr in threadlist:
thr.join()

if __name__ == '__main__':
main()

macroasm