0:常用工具
#后面的三个工具无法安装,原因目前不知,后面用来时再寻找解决方法pip install python-nmap python-bluez bluetooth python obexftp#pycrypto是一个非常强大的加密解密module,对于信息的加密和破解是需要经常用到的pip install pycrypto #在windows下,安装报错后,需要安装一个VCForPython27.msi的软件即可,详细看安装的报错信息#在windows下import crypt,发现找不到此module,发现只在linux系统下Python才自带有此模块crypt.crypt(word, salt) #这个module只有这一个函数
1:Python基础
#导入自己写的moduleimport syssys.path.append("C:/pyqt/chap02") #把我们写的module路径添加到了path路径,这里我们就可以import自己写的module了
#data type port=23banner="hello hacker"type(port)type(banner)banner.upper()banner.lower()banner.replace("old","new")banner.find("hacker")#list portlist=[]portlist.append(22)portlist.append(80)print portlistportlist.sort() #对portlist进行排序 pos=portlist.index(80)portlist.remove(443)print portlistcnt=len(portlist)#dictionaryservices={"ftp":21,"ssh":22,"smtp":25,"http":80}services.keys() # return listservices.items() #change to tuple coupleservices.has_key("ftp") #true or falseservices["ftp"] # return value
2:Networking部分
import socketsocket.setdefaulttimeout(2) #2秒时长没有收到想要的数据长度,就返回了socket.timeout 异常s=socket.socket() #创建一个socket对象s.connect(("8.8.8.8",21))ans=s.recv(1024) #从服务器接收 1024个数据 ,如果在2秒内,没有接收完,就会返回 socket.timeo9ut异常
3: Python简单异常处理
try: 3/0except: print "3/0 is illegal"#下面是除0后,得到的ZeroDivisionError>>> 3/0Traceback (most recent call last): File "", line 1, in ZeroDivisionError: integer division or modulo by zero#异常处理可以保证,程序出错后,自动处理错误,程序可以接着运行下#没有异常处理,程序会由于这些异常直接退出 #查看异常类型:try: 15/0except Exception, e: print "Error"+str(e) #socket中使用异常处理import socketsocket.setdefaulttimeout(2)s=socket.socket()try: s.connect(("8.8.8.8",21)) # 成功后,不会运行except部分except Exception,e: print "error"+str(e) # connect失败后,会运行这部分代码
4:函数的使用
import socketdef abc(arg1,arg2): try: socket.setdefaulttimeout(2) xxx return except: return def main(): xxxif __name__=="__main__": main()
5:IP,Port的扫描
portList=[21,22,25,80,110]for x in range (1,255): for port in portList: print "Checkingt 192.168.1"+str(x)+":"+str(port) #文件的行读取f=open("hello.txt","r")for line in f.readlines(): if line.strip("\n") in banner: #从文件中读取到的行内容是否有用 print "xxxx"
6:sys,os,系统模块
import sysif len(sys.argv)==2: filename=sys.argv[1] print "filename"+filename import osif not os.path.isfile(filename) pirnt filename+" does not exist" return if not os.access(filename,os.R_OK): #chmod 000 a.txt 后,就无法access print filename+" access denied" return
7:运行时决定是否生成函数
import sysif sys.version_info[:2] <(2,4): #小于2.4的版本没有sorted这个函数,那么我们自己写一个,用自己的 def sorted(items): xxx xxx return items
8:Python异常处理
#运行过程:#先try,输出 hello ahc,然后运行3/0后报错#接下来进行except,输出except happened#接下来程序接着往下走(不会执行else)for i in dir(a): try: print "hello ahc" 3/0 except: print "except happened" else: print "run without except"\#运行过程:#输出hello ahc,由于没有异常,所以会运行else,输出run alwaystry: print "hello ahc"except: print "except happened"else: print "run without except"# 下面是一个标准的异常处理过程try: process()except IndexError, e: print "Error: %s" % eexcept LookupError, e: print "Error: %s" % e
9:根据不同的操作系统,选择采用不同的文件路径表达形式(实用)
import platformos_type=platform.platform().lower()if "windows" in os_type: fontfile=r"C:\Windows\Fonts\timesi.ttf"else: fontfile="/usr/share/fonts/truetype/msttcorefonts/Times_New_Roman_Italic.ttf"
10:nmap常用指令
nmamp -sP 192.168.1.1/24 #simple informationsudo namp -O -PN 192.168.1.1/24 #detail infromation
11:python socket发送http get请求
#!/usr/bin/env python# Foundations of Python Network Programming - Chapter 1 - search4.pyimport socketsock = socket.socket()sock.connect(('maps.google.com', 80))sock.sendall( 'GET /maps/geo?q=207+N.+Defiance+St%2C+Archbold%2C+OH' '&output=json&oe=utf8&sensor=false HTTP/1.1\r\n' 'Host: maps.google.com:80\r\n' 'User-Agent: search4.py\r\n' 'Connection: close\r\n' '\r\n')rawreply = sock.recv(4096)print rawreply
12:socket编程要求点
import socket创建sock对象s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #使用ipv4,使用udp协议server: 创建sock s.bind(("ip",port)) #绑定地址 ip是0.0.0.0时,是监听全网,ip是127.0.0.1时,只监听内网 data,address=s.recvfrom() #监听消息 在此block s.sendto("msg",address) #利用上面的地址(ip,port),来发送msgclient: 创建sock s.sendto("msg",address) #操作系统会根据需要,随机分配port data,addr=s.recv(MAX) #这里得到的addr就是上面sendto使用的地址(ip,port)
13:socket编程处理服务器端丢包问题
import sockets=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)s.connect((hostname,port))delay=0.1while True: s.send("this is another message") s.settimeout(delay)
14:使用socket发送二进制原始数据(DNS协议的研究)
import socketdata="8d890100000100000000000005626169647503636f6d0000010001"rawdata=bytes.fromhex(data) # dns raw data to get baidu ips=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)DNSserver="202.114.0.242"s.connect((DNSserver,53))s.send(rawdata) #这里直接发送的是16进制的数据 recvData=s.recv(266) #得到的数据也是最原始的16进制数据,需要阅读DNS协议的格式,然后对数据进行解包print(recvData)
15:使用下面程序研究两个主机之间UDP包能传送的最大数据量是多少
一般的udp包能传送的最大数据量为1500bytes
#clientimport IN,socket,syss=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)MAX=65535PORT =1060s.connect(("192.168.1.1",PORT))s.setsockopt(socket.IPPROTO_IP,IN.IP_MTU_DISCOVER,IN.IP_PMTUDISC_DO)try: s.send("#"*2500)except socket.error: print "message did not make it" option=getattr(IN,"IP_MTU",14) print "MTU:",s.getsockopt(socket.IPPROTO_IP,option)else: print "the big message was sent! Your network supports really big packet"
16:socket的一些属性的设置和得到
s=socket.socket(xx)s.setsockopt(xxx)value=s.getsockopt(xx)#例子,是否允许广播UDP包value=s.getsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST)s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,value)SO_DONTROUTE:只允许包发送给子网hostSO_TYPE:当把这个参数传递给getsockopt函数时,得到当前socket使用的是tcp or udp
17:如何发送UDP广播包 (broadcast packet)
客户端可以开启广播选项:这样发的广播包其它的机器都能接到
服务器端也可开启接收广播包的选项?才能接收广播包?这个要到后面实验看效果:不需要进行其它的配置,只需使用使用sendto时,把具体的server ip地址换成广播地址###client:import socketport=1080broadcastip="192.168.191.255" #mask =255.255.255.0 network addr=192.168.191.0s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)print ("sending message to %s:%s" %(broadcastip,port))s.sendto("this is a broadcast message",(broadcastip,port))###server:import socketdef getLocalIPandHeader(): #得到本机ip地址的函数 """ return localIP and IPhead like this :192.168.1.11 , 192.168.1. """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(('baidu.com', 0)) ip=s.getsockname()[0] lastdotpos=ip.rfind(".") iphead=ip[:lastdotpos+1] return ip,ipheadport=1080bindip,iphead=getLocalIPandHeader()s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)s.bind((bindip,port))while True: data,addr=s.recvfrom(200) pmsg="i got message from %s say: %s" %(addr,data) print(pmsg)
18:关于文件路径的操作
#__file__ 这个变量中保存了该程序的文件名abspath=os.path.abspath(__file__) # a.py ---> /home/gaoy/pyweb/a.pycurrent_dir=os.path.dirname(abspath) #/home/gaoy/pyweb/a.py --->/home/gaoy/pyweb
19:python装饰器的运行过程
def skin(func): print "in skin" def run(): print "in run" func() print "after func" return run@skindef myprint(): print "in my print function"myprint()#运行结果如下 :==========================in skinin runin my print functionafter func==========================#如上myprint()函数被skin装饰当我们调用myprint()函数时,发生了什么?如下:首先skin(myrint())函数会被调用,所以会打印出 "in skin"字符串由于run中函数是在skin函数中定义的并没有调用,所以不会马上运行,重点就在这里的return run,return的run函数给谁呢?python解释器会把这个return的值赋值给myprint,然后调用“新的”myprint()函数简单的说,如果函数被装饰后,按下面方式运行:1:运行skin(myprint) #decorator(func)2:运行装饰器内部定义的函数 #run()