python学习写脚本之从头到尾实录

简介:

学习python,在老雷的指点下去完成一个小需求

功能:检索/var/log/secure中的ip,超过阀值就写入/etc/hosts.deny文件中去

1、首先从/var/log/secure中提取ip地址
2、然后进行排序,挑选出访问量大于500的ip
3、把收集到的ip写入到hosts.deny文件中,写入之前先判断是否已存在

格式要求如下:

1
2
3
4
5
6
7
########2014-06-25#######
60.xxx.xxx.xxx
58.xxx.xxx.xxx
 
########2014-06-26#######
60.xxx.xxx.xxx
58.xxx.xxx.xxx

解决过程

1、首先从/var/log/secure中提取ip地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding: utf-8
# Auther: zhuima
# Date:   2014-06-24
# Function: fetch ip address
# Usage:  python sys.argv[0] logpath
#
 
import  re
import  sys
 
pattern = re.compile(r '(\d+\.\d+\.\d+\.\d+)' )
 
def ip_fetch(logfile):
     with  open (logfile) as f:
         for  line  in  f:
             m = pattern.search(line)
             if  m:
                 print m.group()
 
if  len(sys.argv) == 2:
     ip_fetch(sys.argv[1])
else :
     print  "Usage: python %s /path/logfile"  % sys.argv[0]
     print  " "

效果如下:

1
2
3
4
5
6
7
8
9
[root@nginx1 python] # python tiquip.py secure 
114.114.114.114
 
 
[root@nginx1 python] # python tiquip.py
 
  Usage: python tiquip.py  /path/logfile
 
[root@nginx1 python] #

2、进行排序,挑选出排行前十的ip

需要解决问题:去重排序
sorted()排序
set()去重
裸用dict来做得话:
counter = dict()
for ip in m:
counter[ip] = counter.get(ip, 0) + 1

http://www.newsmth.net/nForum/#!article/Python/113879
http://hi.baidu.com/pythond/item/3607e6564aacae928d12ed41

去重(成哥提供的网站)

from collections import Counter
Counter([1,1,1,2,3,4,1,2,3,4])
Counter({1: 4, 2: 2, 3: 2, 4: 2})

2.1、去重操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@nginx1 python] # cat fetch.py 
# coding: utf-8
# Auther: zhuima
# Date:   2014-06-24
# Function: fetch ip address
# Usage:  python sys.argv[0] logpath
#
 
from collections  import  Counter 
import  re
import  sys
 
pattern = re.compile(r '(\d+\.\d+\.\d+\.\d+)' )
listip = []
def ip_fetch(logfile):
     with  open (logfile) as f:
         for  line  in  f:
             m = pattern.search(line)
             if  m:
                 listip.append(m.group())
                 #print m.group()
 
def  sort ():
     td = Counter(listip)
     for  ip,count  in  td.items():
         print count, "\t" ,ip
 
if  len(sys.argv) == 2:
     ip_fetch(sys.argv[1])
     sort ()
else :
     print  "Usage: python %s /path/logfile"  % sys.argv[0]
     print  " "

效果如下:

1
2
3
4
5
6
7
8
[root@nginx1 python] # python fetch.py secure 
1     114.xxx.xxx.xxx
1     114.xxx.xxx.xxx
1     106.xxx.xxx.xxx
4     124.xxx.xxx.xxx
1     61.xxx.xxx.xxx
 
[root@nginx1 python] #

2.2、接下来进行排序

http://www.cnblogs.com/liyixin/archive/2012/07/23/2605013.html

脚本样式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# coding: utf-8
# Auther: zhuima
# Date:   2014-06-24
# Function: fetch ip address
# Usage:  python sys.argv[0] logpath
#
 
from collections  import  Counter
import  re
import  sys
 
pattern = re.compile(r '(\d+\.\d+\.\d+\.\d+)' )
listip = []
def ip_fetch(logfile):
     with  open (logfile) as f:
         for  line  in  f:
             m = pattern.search(line)
             if  m:
                 listip.append(m.group())
         
 
def  sort ():
     td = Counter(listip)
 
     newtd = sorted(td.iteritems(),key=lambda td:td[1],reverse=True)
   
     for  line  in  newtd:
         print line
 
if  len(sys.argv) == 2:
     ip_fetch(sys.argv[1])
     sort ()
else :
     print  "Usage: python %s /path/logfile"  % sys.argv[0]
     print  " "

效果如下:

1
2
3
4
5
6
7
[root@nginx1 python] # python fetch.py secure 
( '124.64.63.119' , 4)
( '114.245.169.74' , 1)
( '114.252.165.177' , 1)
( '106.37.169.186' , 1)
( '61.49.238.82' , 1)
[root@nginx1 python] #

再次更改,去除数值外面的圆括号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@nginx1 python] # vim fetch.py 
 
# coding: utf-8
# Auther: zhuima
# Date:   2014-06-24
# Function: fetch ip address
# Usage:  python sys.argv[0] logpath
#
 
from collections  import  Counter
import  re
import  sys
 
pattern = re.compile(r '(\d+\.\d+\.\d+\.\d+)' )
listip = []
def ip_fetch(logfile):
     with  open (logfile) as f:
         for  line  in  f:
             m = pattern.search(line)
             if  m:
                 listip.append(m.group())
           
def  sort ():
     td = Counter(listip)
 
     newtd = sorted(td.iteritems(),key=lambda td:td[1],reverse=True)
 
     for  line  in  newtd:
         print line[1], "\t" ,line[0]
 
if  len(sys.argv) == 2:
     ip_fetch(sys.argv[1])
     sort ()
else :
     print  "Usage: python %s /path/logfile"  % sys.argv[0]
     print  " "

效果如下:

1
2
3
4
5
6
7
8
[root@nginx1 python] # python fetch.py secure 
4     124.xxx.xxx.xxx
1     114.xxx.xxx.xxx
1     114.xxx.xxx.xxx
1     106.xxx.xxx.xxx
1     61.xxx.xxx.xxx
 
[root@nginx1 python] #

3、解析来解决如何写入到hosts.deny文件中去

思路:
先判断要写入的ip是否在hosts.deny文件中,如果在,就跳过,如果不在就写入
脚本测试文件,写不进文件中去

1
2
3
4
5
6
7
8
9
10
[root@nginx1 python] # vim write.py
 
# coding utf-8
#
 
x =  '192.168.23.22'
with  open ( "/etc/hosts.deny" , "a+" ) as f:
     for  line  in  f:
         if  x not  in  line:
             f.write(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# coding utf-8
#
 
import  datetime
 
dd  = datetime.
 
x =  '192.168.23.22'
f =  open ( "/etc/hosts.deny" , "a+" )
for  line  in  f:
     if  x not  in  f:
         f.write( "#########" )
         f.write(datetime
         f.write( "#########" )
         f.write(x)
         f.write( "\n" )
 
f.close()

http://blog.sina.com.cn/s/blog_6c3748830100ypt9.html

单个ip验证的时候

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@ rsync  python] # cat write.py
# coding utf-8
#
 
import  datetime
 
 
day = datetime. date .today()
today = day.strftime( "%Y-%m-%d" )
 
x = [ '192.168.23.22' , '192.168.23.21' ]
i = 0
f =  open ( "/etc/hosts.deny" , "a+" )
for  line  in  f:
     if  x[i] not  in  line:
         print x[i]
         f.write( "#########" )
         f.write(today)
         f.write( "#########" )
         f.write( "\n" )
         f.write(x[i])
         f.write( "\n" )
         i += 1
     else :
         print x[i],  "is exists!"
         break
 
f.close()

当然我们实际环境中不可能只用一个ip,肯定会有很多的额,所以这里就需要使用列表了
多个参数传入的时候该如何是好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@ rsync  python] # cat write.py
# coding utf-8
#
 
import  datetime
 
 
day = datetime. date .today()
today = day.strftime( "%Y-%m-%d" )
 
x = [ '192.168.23.22' , '192.168.23.21' ]
i = 0
 
f =  open ( "/etc/hosts.deny" , "a+" )
for  line  in  f:
     if  x[i] not  in  line and i <= len(x):
         f.write( "#########" )
         f.write(today)
         f.write( "#########" )
         f.write( "\n" )
         f.write(x[i])
         f.write( "\n" )
         i += 1
     else :
         print x[i],  "is exists!"
         break

上面代码报错:

1
2
3
4
5
6
7
[root@ rsync  python]
[root@ rsync  python] # python write.py /etc/hosts.deny 
Traceback (most recent call last):
   File  "write.py" , line 20,  in  <module>    
   if  x[i] not  in  line and i <= len(x):
IndexError: list index out of range
[root@ rsync  python] #

踩坑之旅:
一直陷在循环里面挑不出来了,所以就一直绕啊绕~
问题:
1、嵌套循环无法解决上层循环的次数比内层循环的次数多的问题,从而导致插入数据过多
2、判断数据在列表中是否存在的时候老是想着要对比循环
3、基础薄弱

老雷给的建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding utf-8
#
 
import  datetime
 
 
day = datetime. date .today()
today = day.strftime( "%Y-%m-%d" )
 
ip_list = [ '192.168.23.22' , '192.168.23.21' ]
 
data =  open ( "/etc/hosts.deny" , "a+" )
 
content_list = data.readlines()
 
for  in  ip_list:
     if  i not  in  content_list:
         data.write(i+ '\n' )
f.close()

最总完结的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[root@blog python] # cat fetch.py 
# coding: utf-8
# Auther: zhuima
# Date:   2014-06-24
# Function: fetch ip address
# Usage:  python sys.argv[0] logpath
#
 
 
from collections  import  Counter
import  re
import  sys
import  datetime
 
pattern = re.compile(r '(\d+\.\d+\.\d+\.\d+)' )
 
source_listip = []
 
today = datetime. date .today().strftime( "%Y-%m-%d" )
 
def ip_fetch(logfile):
     with  open (logfile) as f:
         for  line  in  f:
             m = pattern.search(line)
             if  m:
                 source_listip.append(m.group())
               
 
def sort_write():
     data_file =  open ( "/etc/hosts.deny" , "a+" )
     content_list = data_file.readlines()
     note = [ "########" ,today, "#######\n" ]
     td = Counter(source_listip)
  
     newtd = sorted(td.iteritems(),key=lambda td:td[1],reverse=True)
 
 
     for  line  in  content_list:
         if  today  in  line.strip( "#" ):
             break
         else :
             data_file.writelines(note)
             break
 
 
     for  line  in  newtd:
         print line[1], "\t" ,line[0]
         if  line[1] >= 500 and line[0] not  in  content_list:
             data_file.write(line[0]+ "\n" )
 
     data_file.close()
 
 
if  len(sys.argv) == 2:
     ip_fetch(sys.argv[1])
     sort_write()
 
else :
     print  "Usage: python %s /path/logfile"  % sys.argv[0]

效果如下图所示:

Note:
由于导入datetime是使用的当前时间,而不是系统时间,所以这里显示的两个时间是一致的
0a79c677-7acc-46d2-95b8-85979b94826e_4_files/524aa759-1ea0-432c-a8f0-0303c3d925ad.pngwKiom1Oqp4mjr0vsAANQBTMbd-0030.jpg

总结:

感谢斌哥的思路指导,感谢成哥的Counter的思路提供,感谢老雷的一路指导~
1、基础知识掌握太弱
2、写的过程中老是急于求成,没有精心来去思考
3、多看官方文档,建议把标准库查看一遍
4、该脚本很烂,后期继续以函数的形式来写



本文转自lovelace521 51CTO博客,原文链接:http://blog.51cto.com/lovelace/1430881,如需转载请自行联系原作者
相关文章
|
9月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
500 2
|
9月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
717 1
|
9月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1609 1
|
11月前
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
11月前
|
JSON API 数据安全/隐私保护
【干货满满】分享微店API接口到手价,用python脚本实现
微店作为知名社交电商平台,其开放平台提供商品查询、订单管理等API接口。本文介绍如何通过微店API获取商品到手价(含优惠、券等),涵盖认证机制、Python实现及关键说明。
|
11月前
|
JSON API 数据安全/隐私保护
【干货满满】分享淘宝API接口到手价,用python脚本实现
淘宝开放平台通过API可获取商品到手价,结合商品详情与联盟接口实现优惠计算。需使用AppKey、AppSecret及会话密钥认证,调用taobao.tbk.item.info.get接口获取最终价格。代码示例展示签名生成与数据解析流程。
|
11月前
|
JSON API 数据安全/隐私保护
深度分析苏宁API接口,用Python脚本实现
苏宁易购开放平台提供覆盖商品、订单、库存、门店等零售全链路的API服务,采用RESTful架构与“AppKey+AppSecret+签名”认证机制,支持线上线下一体化业务处理。本文详解其API特性、认证流程及Python调用实现。
|
11月前
|
自然语言处理 安全 API
深度分析洋码头API接口,用Python脚本实现
洋码头是国内知名跨境电商平台,专注于海外商品直购。本文基于其API的通用设计逻辑,深入解析了认证机制、签名规则及核心接口功能,并提供了Python调用示例,适用于商品与订单管理场景。
|
11月前
|
JSON API 数据格式
深度分析易贝API接口,用Python脚本实现
本文深度解析了eBay开放平台的RESTful API接口体系,涵盖其核心功能、OAuth 2.0认证机制、请求规范及限流策略,并基于Python构建了完整的API调用框架。内容包括商品与订单管理接口的实现逻辑、认证流程、错误处理机制及实战调用示例,适用于跨境电商系统开发与多平台集成。
|
11月前
|
JSON API 数据格式
深度分析大麦网API接口,用Python脚本实现
大麦网为国内领先演出票务平台,提供演唱会、话剧、体育赛事等票务服务。本文基于抓包分析其非官方接口,并提供Python调用方案,涵盖演出列表查询、详情获取及城市列表获取。需注意非官方接口存在稳定性风险,使用时应遵守平台规则,控制请求频率,防范封禁与法律风险。适用于个人学习、演出信息监控等场景。

推荐镜像

更多