一、hashlib模块

1、什么是哈希hash

hash一类算法,该算法接受传入的内容,经过运算得到一串hash值
hash值的特点:
I 只要传入的内容一样,得到的hash值必然一样
II 不能由hash值返解成内容
III 不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定

2、hash的用途

用途1:特点II用于密码密文传输与验证
用途2:特点I、III用于文件完整性校验

3、如何用

  1. import hashlib
  2. m=hashlib.md5()
  3. m.update('hello'.encode('utf-8'))
  4. m.update('world'.encode('utf-8'))
  5. res=m.hexdigest() # 'helloworld'
  6. print(res)
  7. m1=hashlib.md5('he'.encode('utf-8'))
  8. m1.update('llo'.encode('utf-8'))
  9. m1.update('w'.encode('utf-8'))
  10. m1.update('orld'.encode('utf-8'))
  11. res=m1.hexdigest()# 'helloworld'
  12. print(res)

模拟撞库

  1. cryptograph='aee949757a2e698417463d47acac93df'
  2. import hashlib
  3. # 制作密码字段
  4. passwds=[
  5. 'alex3714',
  6. 'alex1313',
  7. 'alex94139413',
  8. 'alex123456',
  9. '123456alex',
  10. 'a123lex',
  11. ]
  12. dic={}
  13. for p in passwds:
  14. res=hashlib.md5(p.encode('utf-8'))
  15. dic[p]=res.hexdigest()
  16. # 模拟撞库得到密码
  17. for k,v in dic.items():
  18. if v == cryptograph:
  19. print('撞库成功,明文密码是:%s' %k)
  20. break

提升撞库的成本=>密码加盐

  1. import hashlib
  2. m=hashlib.md5()
  3. m.update('天王'.encode('utf-8'))
  4. m.update('alex3714'.encode('utf-8'))
  5. m.update('盖地虎'.encode('utf-8'))
  6. print(m.hexdigest())

二、subprocess模块

拿到命令的运行结果

  1. import subprocess
  2. obj=subprocess.Popen('echo 123 ; ls / ; ls /root',shell=True,
  3. stdout=subprocess.PIPE,
  4. stderr=subprocess.PIPE,
  5. )
  6. # print(obj)
  7. # res=obj.stdout.read()
  8. # print(res.decode('utf-8'))
  9. err_res=obj.stderr.read()
  10. print(err_res.decode('utf-8'))

三、logging日志模块

1、基础配置

  1. import logging
  2. logging.basicConfig(
  3. # 1、日志输出位置:1、终端 2、文件
  4. filename='access.log', # 不指定,默认打印到终端
  5. # 2、日志格式
  6. format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
  7. # 3、时间格式
  8. datefmt='%Y-%m-%d %H:%M:%S %p',
  9. # 4、日志级别
  10. # critical => 50
  11. # error => 40
  12. # warning => 30
  13. # info => 20
  14. # debug => 10
  15. level=10,
  16. )
  17. logging.debug('调试debug') # 10
  18. logging.info('消息info') # 20
  19. logging.warning('警告warn')# 30
  20. logging.error('egon提现失败') # 40
  21. logging.critical('严重critical') # 50

2、日志配置

文件settings.py

  1. # 2.1 定义三种日志输出格式,日志中可能用到的格式化串如下
  2. # %(name)s Logger的名字
  3. # %(levelno)s 数字形式的日志级别
  4. # %(levelname)s 文本形式的日志级别
  5. # %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
  6. # %(filename)s 调用日志输出函数的模块的文件名
  7. # %(module)s 调用日志输出函数的模块名
  8. # %(funcName)s 调用日志输出函数的函数名
  9. # %(lineno)d 调用日志输出函数的语句所在的代码行
  10. # %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
  11. # %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
  12. # %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
  13. # %(thread)d 线程ID。可能没有
  14. # %(threadName)s 线程名。可能没有
  15. # %(process)d 进程ID。可能没有
  16. # %(message)s用户输出的消息
  17. # 2.2 强调:其中的%(name)s为getlogger时指定的名字
  18. standard_format = '%(asctime)s - %(threadName)s:%(thread)d - 日志名字:%(name)s - %(filename)s:%(lineno)d -' \
  19. '%(levelname)s - %(message)s'
  20. simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
  21. test_format = '%(asctime)s] %(message)s'
  22. # 2.3 日志配置字典
  23. LOGGING_DIC = {
  24. 'version': 1,
  25. 'disable_existing_loggers': False,
  26. # 日志格式
  27. 'formatters': {
  28. 'standard': {
  29. 'format': standard_format
  30. },
  31. 'simple': {
  32. 'format': simple_format
  33. },
  34. 'test': {
  35. 'format': test_format
  36. },
  37. },
  38. 'filters': {},
  39. # handlers是日志的接收者,不同的handler会将日志输出到不同的位置
  40. 'handlers': {
  41. #打印到终端的日志
  42. 'console': {
  43. 'level': 'DEBUG',
  44. 'class': 'logging.StreamHandler', # 打印到屏幕
  45. 'formatter': 's imple'# 日志格式
  46. },
  47. 'default': {
  48. 'level': 'DEBUG',
  49. 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
  50. # 'maxBytes': 1024*1024*5, # 日志大小 5M
  51. 'maxBytes': 1000,
  52. 'backupCount': 5,
  53. 'filename': 'a1.log', # os.path.join(os.path.dirname(os.path.dirname(__file__)),'log','a2.log')
  54. 'encoding': 'utf-8',
  55. 'formatter': 'standard',
  56. },
  57. #打印到文件的日志,收集info及以上的日志
  58. 'other': {
  59. 'level': 'DEBUG',
  60. 'class': 'logging.FileHandler', # 保存到文件
  61. 'filename': 'a2.log', # os.path.join(os.path.dirname(os.path.dirname(__file__)),'log','a2.log')
  62. 'encoding': 'utf-8',
  63. 'formatter': 'test',
  64. },
  65. },
  66. # loggers是日志的产生者,产生的日志会传递给handler然后控制输出
  67. 'loggers': {
  68. #logging.getLogger(__name__)拿到的logger配置
  69. 'kkk': {
  70. 'handlers': ['console','other'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  71. 'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
  72. 'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
  73. },
  74. '终端提示': {
  75. 'handlers': ['console',], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  76. 'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
  77. 'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
  78. },
  79. '': {
  80. 'handlers': ['default', ], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
  81. 'level': 'DEBUG', # loggers(第一层日志级别关限制)--->handlers(第二层日志级别关卡限制)
  82. 'propagate': False, # 默认为True,向上(更高level的logger)传递,通常设置为False即可,否则会一份日志向上层层传递
  83. },
  84. },
  85. }

sec.py生产日志

  1. # 课后了解性质——》闲着没事自己研究下
  2. # import logging.config
  3. #
  4. # logging.config.dictConfig(settings.LOGGING_DIC)
  5. # print(logging.getLogger)
  6. # 接下来要做的是:拿到日志的产生者即loggers来产生日志
  7. # 第一个日志的产生者:kkk
  8. # 第二个日志的产生者:bbb
  9. # 但是需要先导入日志配置字典LOGGING_DIC
  10. import settings
  11. from logging import config,getLogger
  12. config.dictConfig(settings.LOGGING_DIC)
  13. # logger1=getLogger('kkk')
  14. # logger1.info('这是一条info日志')
  15. # logger2=getLogger('终端提示')
  16. # logger2.info('logger2产生的info日志')
  17. # logger3=getLogger('用户交易')# 找不到的K会用空k
  18. # logger3.info('logger3产生的info日志')
  19. logger4=getLogger('用户常规')
  20. logger4.info('logger4产生的info日志')

补充两个重要额知识
1、日志名的命名
日志 名是区别日志业务归属的一种非常重要的标识
找不到的K会用空k

2、日志轮转
日志记录着程序员运行过程中的关键信息

四、正则表达式 re模块

import re

print(re.findall(‘\w’,’aAbc123*()-=’))
# print(re.findall(‘\W’,’aAbc123
()-= ‘))
# print(re.findall(‘\s’,’aA\rbc\t\n12\f3_
()-= ‘))
# print(re.findall(‘\S’,’aA\rbc\t\n12\f3*()-= ‘))
# print(re.findall(‘\d’,’aA\rbc\t\n12\f3
()-= ‘))
# print(re.findall(‘\D’,’aA\rbc\t\n12\f3_
()-= ‘))
# print(re.findall(‘\D’,’aA\rbc\t\n12\f3_*()-= ‘))
# print(re.findall(‘\Aalex’,’ alexis alex sb’))
# alex
# print(re.findall(‘sb\Z’,’ alexis alexsb sb’))
# sb\Z
# print(re.findall(‘sb\Z’,”””alex
# alexis
# alex
# sb
# “””))

print(re.findall(‘^alex’,’alexis alex sb’))
# print(re.findall(‘sb$’,’alexis alex sb’))
# print(re.findall(‘sb$’,”””alex
# alexis
# alex
# sb
# “””))

print(re.findall(‘^alex$’,’alexis alex sb’))
# print(re.findall(‘^alex$’,’al ex’))
# print(re.findall(‘^alex$’,’alex’))

重复匹配:| . | | ? | . | .? | + | {n,m} |
1、.:匹配除了\n之外任意一个字符,指定re.DOTALL之后才能匹配换行符
print(re.findall(‘a.b’,’a1b a2b a b abbbb a\nb a\tb a
b’))
a.b
[‘a1b’,’a2b’,’a b’,’abb’,’a\tb’,’ab’]
print(re.findall(‘a.b’,’a1b a2b a b abbbb a\nb a\tb a
b’,re.DOTALL))

2、:左侧字符重复0次或无穷次,性格贪婪
print(re.findall(‘ab
‘,’a ab abb abbbbbbbb bbbbbbbb’))
ab*
[‘a’,’ab’,’abb’,’abbbbbbbb’]

3、+:左侧字符重复1次或无穷次,性格贪婪
print(re.findall(‘ab+’,’a ab abb abbbbbbbb bbbbbbbb’))
ab+

4、?:左侧字符重复0次或1次,性格贪婪
print(re.findall(‘ab?’,’a ab abb abbbbbbbb bbbbbbbb’))
ab?
[‘a’,’ab’,’ab’,’ab’]

5、{n,m}:左侧字符重复n次到m次,性格贪婪
{0,} => *
{1,} => +
{0,1} => ?
{n}单独一个n代表只出现n次,多一次不行少一次也不行

print(re.findall(‘ab{2,5}’,’a ab abb abbb abbbb abbbbbbbb bbbbbbbb’))
ab{2,5}
[‘abb’,’abbb’,’abbbb’,’abbbbb]

print(re.findall(‘\d+.?\d‘,”asdfasdf123as1111111.123dfa12adsf1asdf3”))
\d+.?\d
\d+.?\d+
5

[]匹配指定字符一个
print(re.findall(‘a\db’,’a1111111b a3b a4b a9b aXb a b a\nb’,re.DOTALL))
print(re.findall(‘a[501234]b’,’a1111111b a3b a4b a9b aXb a b a\nb’,re.DOTALL))
print(re.findall(‘a[0-5]b’,’a1111111b a3b a1b a0b a4b a9b aXb a b a\nb’,re.DOTALL))
print(re.findall(‘a[0-9a-zA-Z]b’,’a1111111b axb a3b a1b a0b a4b a9b aXb a b a\nb’,re.DOTALL))

print(re.findall(‘a[^0-9a-zA-Z]b’,’a1111111b axb a3b a1b a0b a4b a9b aXb a b a\nb’,re.DOTALL))
print(re.findall(‘a-b’,’a-b aXb a b a\nb’,re.DOTALL))
print(re.findall(‘a[-0-9\n]b’,’a-b a0b a1b a8b aXb a b a\nb’,re.DOTALL))