Ubuntu kullanmaya başlayalı 2 hafta kadar oldu. Bu dönemde MS yazılımlarına elveda ediyorum.
Ubuntu kullanmaya başladığımdan beri çok hoş bir dil olan Python öğrenmeye başladım. Syntax'ı oldukça güzel. Çoğunuzun da bildiği gibi python düzenli bir syntaxa sahip. Düzenli syntaxtan kastım "{}" ve ";" işaretlerinin yerine girinti çıkıntı kullanma zorunluluğudur. Bu da kod okunurluğunu artırıyor. El alışınca da hakikaten yazdığınız kodlardan büyük haz alıyorsunuz(En azından benim için öyle :) ).
Bence bir dil üzerinde kendinizi geliştirmenin en kolay yolu gerçekten işe yarayabilecek uygulamalar yazmaktır. Bu sayede algoritma ve akış diyagramlarını ne şekilde nerelerde kullanacağınızı daha fazla düşünme fırsatınız oluyor. Ben de bu şekilde 2-3 günde bir ufak betikler yazmaya başladım.
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 :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()