抓取网页资源的 10个小技巧

1、最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response.read() 2、使用 Request import urllib.request req = urllib.request.Request('http://python.org/') response = urllib.request.urlopen(req) the_page = response.read() 3、发送数据 #! /usr/bin/env python3 import urllib.parse import urllib.request url = 'http://localhost/login.php' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {      'act' : 'login',      'login' : 'admin@guoziweb.com',      'login' : '123456'      } data = urllib.parse.urlencode(values) req = urllib.request.Request(url, data) req.add_header('Referer', 'http://www.python.org/') response = urllib.request.urlopen(req) the_page = response.read() print(the_page.decode("utf8")) 4、发送数据和header #! /usr/bin/env python3 import urllib.parse import urllib.request url = 'http://localhost/login.php' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' values = {      'act' : 'login',      'login' : 'admin@guoziweb.com',      'login' : '123456'      } headers = { 'User-Agent' : user_agent } data = urllib.parse.urlencode(values) req = urllib.request.Request(url, data, headers) response = urllib.request.urlopen(req) the_page = response.read() print(the_page.decode("utf8")) 5、http 错误 #! /usr/bin/env python3 import urllib.request req = urllib.request.Request('http://www.python.org/fish.html') try:   urllib.request.urlopen(req) except urllib.error.HTTPError as e:   print(e.code)   print(e.read().decode("utf8")) 6、异常处理 #! /usr/bin/env python3 from urllib.request import Request, urlopen from urllib.error import URLError, HTTPError req = Request("http://twitter.com/") try:   response = urlopen(req) except HTTPError as e:   print('The server couldn\'t fulfill the request.')   print('Error code: ', e.code) except URLError as e:   print('We failed to reach a server.')   print('Reason: ', e.reason) else:   print("good!")   print(response.read().decode("utf8")) 7、异常处理2 #! /usr/bin/env python3 from urllib.request import Request, urlopen from urllib.error import URLError req = Request("http://twitter.com/") try:   response = urlopen(req) except URLError as e:   if hasattr(e, 'reason'):     print('We failed to reach a server.')     print('Reason: ', e.reason)   elif hasattr(e, 'code'):     print('The server couldn\'t fulfill the request.')     print('Error code: ', e.code) else:   print("good!")   print(response.read().decode("utf8")) 8、HTTP 认证 #! /usr/bin/env python3 import urllib.request # create a password manager password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() # Add the username and password. # If we knew the realm, we could use it instead of None. top_level_url = "https://cms.tetx.com/" password_mgr.add_password(None, top_level_url, 'guozi', 'cccddd') handler = urllib.request.HTTPBasicAuthHandler(password_mgr) # create "opener" (OpenerDirector instance) opener = urllib.request.build_opener(handler)...
阅读全文

服务器批量SSH命令分发

摘要:在主控主机上实现命令的批量分发。环境:python2.7.12  ecdsa paramiko。1、ssh模块安装Windows下安装包:pycrypto   直接下载exe安装程序安装ecdsa        使用源码安装,安装版本需要>=0.11paramiko  使用源码安装,python setup.py install Linux下安装:pip install paramiko2、ssh模块封装文件名为:class_ssh.py# -*- coding:utf-8 -*- import paramiko import os import traceback import sys class class_remote_ssh:     def __init__(self,remoteip,username,password,port=22):         self.ssh = paramiko.SSHClient()         self.remoteip = remoteip         self.username = username         self.password = password         #self.command = command         self.port = port     def ssh_connect(self):         try:             self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())             self.ssh.connect(self.remoteip, self.port, self.username, self.password)         except Exception,e:             traceback.print_exc()     def ssh_exec_command(self,command):         try:             stdin, stdout, stderr = self.ssh.exec_command(command)             c = stdout.readlines()             if(c):                 return c             else:                 return stderr.readlines()         except Exception,e:             traceback.print_exc()     def ssh_close(self):         try:             self.ssh.close()         except:             pass def function_remote_ssh(remoteip,username,password,command,port=22):     class_ssh = class_remote_ssh(remoteip,username,password,port)     class_ssh.ssh_connect()     c = class_ssh.ssh_exec_command(command)     class_ssh.ssh_close()     #print c     return c3、远程分发ssh命令模块文件名为:RemoteSSH.py# _*_ coding:utf-8 _* #!/usr/bin/env python import class_ssh import os import json,sys import logging logfile = 'debug.log' print logfile logger = logging.getLogger('main') logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(logfile) # 定义handler的输出格式formatter formatter = logging.Formatter('%(asctime)s %(filename)s:%(lineno)d %(levelname)s %(message)s','%Y-%m-%d %H:%M:%S') fh.setFormatter(formatter) logger.addHandler(fh) #iplist =  print os.getcwd() json_obj = {} try:     with open("config.json","r") as fd:         json_obj = json.load(fd) except ValueError:     logger.debug('json loads failure')     sys.exit(-1)      iplist  =   json_obj cmd    =   json_obj username =   json_obj passwd  =   json_obj port   =   json_obj for ip in iplist:     for c in cmd:         logger.debug("Connect to  and exec command " % (ip, c))         result = class_ssh.function_remote_ssh(ip, username, passwd, c, port)         if result:             logger.debug("command exec result " % result)4、配置文件config.json    文件名为:config.json{   "ServerIP":,   "UserName":"root",   "Password":"123456",   "Port":22,   "Command": }    字段说明:    ServerIP     :服务器IP列表,可支持多个    UserName :服务器ssh登录用户名    Password    : 服务器材ssh登录密码    Port             : SSH端口    Command   : 需要执行的命令,可有多个5、运行    配置好各参数后,直接运行以下命令即可:python RemoteSSH.py
阅读全文

使用阿里云域名作为DDNS解析

1、安装SDKpip install aliyun-python-sdk-alidns2、实现代码#!/usr/bin/env python # -*- coding: UTF-8 -*- from aliyunsdkcore import client from aliyunsdkalidns.request.v20150109 import DescribeDomainsRequest,DescribeDomainRecordsRequest,UpdateDomainRecordRequest from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordInfoRequest import json,urllib,re # 替换以下参数 access_id ="yourid" access_key ="yourkey" # 如果没有ECS可不用改 RegionId="cn-hangzhou" # 一级域名,如 guoziweb.com DomainName="guoziweb.com" # 想要自动修改的主机名和域名类型,列表中可写多个 HostNameList =  # A记录 Types = "A" # 参数替换完毕 clt = client.AcsClient(access_id,access_key,RegionId) #获取公网ip def GetLocalIP():     IPInfo = urllib.urlopen("http://ip.chinaz.com/getip.aspx").read()     IP = re.findall(r"ip:'(.*?)',", IPInfo)     return IP #获取域名列表(暂时无用) def GetDomainList():     DomainList = DescribeDomainsRequest.DescribeDomainsRequest()     DomainList.set_accept_format('json')     DNSListJson = json.loads(clt.do_action_with_exception(DomainList))     print DNSListJson      #更新域名ip def EditDomainRecord(HostName, RecordId, Types, IP):     UpdateDomainRecord = UpdateDomainRecordRequest.UpdateDomainRecordRequest()     UpdateDomainRecord.set_accept_format('json')     UpdateDomainRecord.set_RecordId(RecordId)     UpdateDomainRecord.set_RR(HostName)     UpdateDomainRecord.set_Type(Types)     UpdateDomainRecord.set_TTL('600')     UpdateDomainRecord.set_Value(IP)     UpdateDomainRecordJson = json.loads(clt.do_action_with_exception(UpdateDomainRecord))     print UpdateDomainRecordJson      def OldIP(RecordId):     request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()     request.set_RecordId(RecordId)     request.set_accept_format('json')     result = clt.do_action(request)     result = json.JSONDecoder().decode(result)     result = result     return result      #获取域名信息 def GetAllDomainRecords(DomainName, Types, IP):     DomainRecords = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()     DomainRecords.set_accept_format('json')     DomainRecords.set_DomainName(DomainName)     DomainRecordsJson = json.loads(clt.do_action_with_exception(DomainRecords))     for HostName in HostNameList:         for x in DomainRecordsJson:             RR = x             Type = x             if RR == HostName and Type == Types:                 RecordId = x                 #print RecordId                 if IP != OldIP(RecordId):                     #如果IP不相等则更新                     EditDomainRecord(HostName, RecordId, Types, IP)                 else:                     print 'IP相同,不需要添加解析记录'                      IP = GetLocalIP() print "公网IP为:" + IP #GetDomainList() GetAllDomainRecords(DomainName, Types, IP)
阅读全文
Python

Python网络数据监听和过滤

windows下pcapy包下载地址:https://breakingcode.wordpress.com/2012/07/16/quickpost-updated-impacketpcapy-installers-for-python-2-5-2-6-2-7/转自:http://www.cnblogs.com/xuanhun/p/5625186.html涉及到的几个python网络抓包和分析的模块,dpkt和scapy在kali linux 2.0 中默认已经被安装,如果你的系统中没有需要手动安装一下,下面是软件包安装的简单说明。在kali下安装pypcap需要两步(如果在其他系统上可能还需要安装python-dev):apt-get install libpcap-devpip install pypcap  使用pip安装scapy。root@kali:/home/pycharm# pip install scapy使用pip安装scapy-http。root@kali:/home/pycharm# pip install scapy-http基础环境准备好之后,我还要再唠叨一下你必须要掌握的基础。1.1  技术没有黑白,网络编程的基础是协议把编程挂上黑客的名义,多少有些标题党。代码怎么写,程序怎么用,完全是技术问题。不会因为叫网络编程就低人一等,叫黑客编程也不会变得神秘或者高大上,代码就在那里,不卑微也不高尚。所以学习编程,要有颗平常心。很多听课的同学和我反应,网络编程格外的吃力,繁琐,要实现某种功能,如果Google不到类似的代码就无法下手。各种语言或者框架针对网络编程的实现基本都相同,因为我们接触到网络通信都基于统一的规范和标准,语言和框架只是在用自己的方式去描述这个规范而已。本质的问题来了,如果你连基本的网络通信的四层模型都不懂,对TCP/IP协议族毫无概念,那么我奉劝你先不要着急敲代码,找本书,打开WireShark这样的工具好好做做练习。本次课程中的所有案例,其实都在遵循一个基本的思路(其他网络通信场景类似):初始化以太网数据包对象à以太网数据包分离出ip数据包àIP数据包分离传输层数据包à传输层数据包分离应用层数据包。只要我们具备基础的网络知识,结合程序中各个对象提供的字段就能得到我们想要的任何基础信息,在此基础上做些信息处理就能完成大部分网络监听和数据处理的任务。附上几幅图,如果这方面有欠缺的话,请立即去充电吧! 以太网帧格式 ip数据包格式Tcp数据包格式1.2  使用PYPCAP实时抓包pypcap进行实时的数据包捕获,使用上很简单,我们先看一小段示例代码:import pcap pc=pcap.pcap('wlan0')  #注,参数可为网卡名,如eth0pc.setfilter('tcp port 80')    #2.设置监听过滤器for ptime,pdata in pc:    #ptime为收到时间,pdata为收到数据    print ptime,pdata    #...在上面的代码中,我们通过“import pcap”首先引入pypcap包,然后初始化一个pcap类实例,构造函数需要传入一个网卡用来监听,我们可以通过ifconfig获取当前机器上的网卡。pcap类的setfilter方法用来设置监听过滤条件,这里我们设置过滤的数据包为tcp协议80端口的数据。之后程序就进入监听状态了。接下来我们循环输出接收到的数据,ptime为时间,pdata的数据,默认数据打印为ascii字符,效果如下:在抓到数据包之后,下一步就需要对数据进行解析,这里我们引入dpkt组件包。1.3  使用DPKT 解析数据包 dpkt,简单来说是一个数据包解析工具,可以解析离线/实时pcap数据包。1.3.1 实时解析我们以下面的代码为例,讲解基本应用。import pcapimport dpkt def captData():    pc=pcap.pcap('wlan0')  #注,参数可为网卡名,如eth0    pc.setfilter('tcp port 80')    #设置监听过滤器    for ptime,pdata in pc:    #ptime为收到时间,pdata为收到数据        anlyCap(pdata); def anlyCap(pdata):    p=dpkt.ethernet.Ethernet(pdata)    if p.data.__class__.__name__=='IP':        ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))        if p.data.data.__class__.__name__=='TCP':            if p.data.data.dport==80:                print p.data.data.data # http 请求的数据  captData();在上面代码中,我们首先导入dpkt包。这段代码中新增了一个anlyCap方法,该方法接收由pcap捕获的http数据包,然后先取得ip数据报文,从ip报文中再提取tcp数据包,最后从tcp数据包中提取http请求的数据,将其打印出来。对于数据包的分析,新手可能会感到迷茫,如何选择合适的协议和方法来分析呢?这个问题的答案不在代码,而在于网络通信协议本身的掌握和理解。回到上面的代码,我们想要分析http请求的数据,http是应用层协议,通过TCP协议来传输数据,那么TCP数据又被封装在IP数据报文中。使用dpkt的第一步就是选择数据包类型,这里当然是要选择以太网数据包了。按照网络协议,层层剥离,会解析到所有你想要的数据。 1.3.2 解析离线数据包下面我们来看一个解析离线数据包的例子。import dpktimport socket #----------------------------------------------------------------------def printPcap(pcap):    """"""    for(ts,buf) in pcap:        try:            eth=dpkt.ethernet.Ethernet(buf);            ip=eth.data;            src=socket.inet_ntoa(ip.src);            dst=socket.inet_ntoa(ip.dst);            tcp=ip.data;#tcp.dport  tcp.sport            print 'Src: '+src+ ' --->Dst: '+ dst        except:            pass;#----------------------------------------------------------------------def main():    """"""    f=open('/home/pcap/test.pcap');#1.open file    pcap=dpkt.pcap.Reader(f);# init pcap obj    printPcap(pcap); if __name__ == '__main__':    main();    首先我准备了一个测试的抓包文件—test.pcap,该文件是我使用wireshark在windows上抓取的数据包,现在使用代码对齐进行基本的分析。在方法printPcap中,获取ip数据报的内容,然后获取它的源ip和目标ip数据,通过socket.inet_ntoa方法转换成ip字符串,最后打印出来。结果如下图所示:1.4 使用SCAPY进行数据监听Scapy的是一个强大的交互式数据包处理程序(使用python编写)。它能够伪造或者解码大量的网络协议数据包,能够发送、捕捉、匹配请求和回复包等等。它可以很容易地处理一些典型操作,比如端口扫描,tracerouting,探测,单元 测试,攻击或网络发现(可替代hping,NMAP,arpspoof,ARP-SK,arping,tcpdump,tethereal,P0F等)。 最重要的他还有很多更优秀的特性——发送无效数据帧、注入修改的802.11数据帧、在WEP上解码加密通道(VOIP)、ARP缓存攻击(VLAN) 等,这也是其他工具无法处理完成的。Scapy可以单独使用,也可以在python中调用。1.4.1 Scapy基本使用了解Scapy的基本使用和支持的方法,首先我们从终端启动scapy,进入交互模式。ls()显示scapy支持的所有协议。ls()函数的参数还可以是上面支持的协议中的任意一个的类型属性,也可以是任何一个具体的数据包,如ls(TCP),ls(newpacket)等。lsc()列出scapy支持的所有的命令。本篇文章使用的只是scapy众多命令中的一个,sniff。conf:显示所有的配置信息。conf变量保存了scapy的配置信息。help()显示某一命令的使用帮助,如help(sniff)。show()显示指定数据包的详细信息。例如,这里我们先创建一个IP数据包,然后调用show方法。sprintf()输出某一层某个参数的取值,如果不存在就输出”??”,具体的format格式是:%field%,详细的使用参考<Security Power Tools>的146页。%field%layer:协议层的名字,如Ether、IP、Dot11、TCP等。filed:需要显示的参数。nb:当有两个协议层有相同的参数名时,nb用于到达你想要的协议层。r:是一个标志。当使用r标志时,意味着显示的是参数的原始值。例如,TCP标志中使用人类可阅读的字符串’SA’表示SYN和ACK标志,而其原始值是18.1.4.2  sniffScapy的功能如此强大,足够写个系列了,本文只关注sniff这一个方法。sniff方法是用来嗅探数据的,我们首先使用help查看一下此方法的使用说明:sniff(count=0, store=1, offline=None, prn=None, lfilter=None, L2socket=None, timeout=None,...
阅读全文