自学python自动运维的第二天
我使用的python版本是python3的,以下代码如有需要的小伙伴解锁相关的代码块即可运行,每个代码块之间用空行隔开。部分代码给了打印结果,该部分可忽略。以自己运行的结果为准。
今天主要学习了IP地址处理IPy模块,DNS处理dnspython模块,文件比较difflib模块自动化运维的服务器状态检查,以及源文件夹和备份文件夹的差异对比,文件替换(更新备份文件)。
"""python自动化运维,前一天学习的相关内容"""
"""IP地址处理模块"""
# # 测试
# from IPy import IP
# print(IP('0.0.0.0/16').version()) # 输出IP地址的类型,4表示IPV4,6表示IPV6
# print(IP('::1').version())
"""ip地址,网段的基本处理"""
# from IPy import IP
# ip = IP('192.168.1.252/30')
# print(ip.len()) # 输出网段的IP个数
# for i in ip:
# print(i) # 打印该网段的所有IP清单
"""python自动化运维,学习的第二天"""
# # IP类的常用方法介绍
# from IPy import IP
# ip =IP("192.168.1.20")
# print(ip.reverseName()) # 反向解析地址格式 输出格式:20.1.168.192.in-addr.arpa.
# print(ip.iptype()) # 判断ip地址为公网(PUBLIC),还是私网(PRIVATE)
# print(ip.int()) # 转换为整型格式
# print(ip.strHex()) # 转换为十六进制
# print(ip.strBin()) # 转换为二进制
# print(IP(0xc0a80114)) # 将十六进制转化为IP格式
# # IP方法也支持网络地址转换
# from IPy import IP
# print(IP("192.168.1.0").make_net("255.255.255.0"))
# print(IP("192.168.1.0/255.255.255.0",make_net=True))
# print(IP("192.168.1.0-192.168.1.255",make_net=True))
# # 还可以通过strNormal方法指定不同wanprefixlen参数以定制不同输出类型的网段
# print(IP("192.168.1.0/24").strNormal(0))
# print(IP("192.168.1.0/24").strNormal(1))
# print(IP("192.168.1.0/24").strNormal(2))
# print(IP("192.168.1.0/24").strNormal(3))
# """输出结果:
# 192.168.1.0/24
# 192.168.1.0/24
# 192.168.1.0/24
# 192.168.1.0
# 192.168.1.0/24
# 192.168.1.0/255.255.255.0
# 192.168.1.0-192.168.1.255"""
"""多网络计算方法"""
# # 支持比较大小,以及包含关系
# from IPy import IP
# print(IP("10.0.0.0")<IP("12.0.0.0")) # 返回值为bool类型
# print("192.168.1.100" in IP("192.168.1.0/24"))
# print(IP("192.168.1.0/24") in IP("192.168.0.0/16"))
# # 判断两个网段是否重叠
# print(IP("192.168.0.0/23").overlaps("192.168.1.0/24")) # 返回1重叠,返回0不重叠
"""IPy模块示例"""
# from IPy import IP
# ip_s = input("请输入IP地址或网段地址:")
# ips = IP(ip_s)
# if len(ips) > 1:
# print("网络地址:%s"%ips.net())
# print("子网掩码:%s"%ips.netmask())
# print("广播地址:%s"%ips.broadcast())
# print("地址反向解析:%s"%ips.reverseNames()[0])
# print("该网段网络子网数:%s"%len(ips))
# else:
# print("该地址的反向解析:%s"%ips.reverseNames()[0])
# print("十六进制地址:%s"%ips.strHex())
# print("二进制地址:%s"%ips.strBin())
# print("地址类型:%s"%ips.iptype())
"""
DNS处理模块
A记录:将主机名转换为IP地址
MX记录:邮件交换记录,定义邮件服务器的域名
CNAME记录:指别名记录,实现域名间的映射
NS记录:标记区域的域名服务器及授权子域
SOA记录:SOA标记,一个起始授权区的定义
"""
"""模块域名解析方法,常见解析类型"""
# # A记录
# import dns.resolver
# domain = input("请输入域名地址:") # 输入地址为www.baidu.com
# A = dns.resolver.resolve(domain,"A") # 指定记录类型
# for i in A.response.answer:
# print(i)
# for j in i.items:
# print(j) # 其中包含了cname后的目标域名
# # MX记录
# import dns.resolver
# domain = input("请输入域名地址:") # 输入的地址为163.com
# MX = dns.resolver.resolve(domain,"MX")
# for i in MX:
# print("MX preference =",i.preference,"mail exchanger =",i.exchange)
# # NS记录
# import dns.resolver
# domain = input("请输入域名地址:") # 只能接收一级域名,当域名是二级或多级时,则会报错,输入的域名为baidu.com
# ns = dns.resolver.resolve(domain,"NS")
# for i in ns.response.answer:
# for j in i.items:
# print(j)
# # CNAME记录
# import dns.resolver
# domain = input("请输入域名地址:")
# cname = dns.resolver.resolve(domain,"CNAME")
# for i in cname.response.answer:
# for j in i.items:
# print(j) # 返回cname后的目标域名
"""DNS模块示例"""
# # 基于域名轮循的业务监控
# import dns.resolver
# import http.client
# import socket
# iplist = []
# appdomain= "www.baidu.com"
# def get_iplist(domain=""):
# try:
# A = dns.resolver.resolve(domain,"A") # 查询A记录,域名解析
# except Exception as e:
# print("dns resolver error:"+str(e))
# return
# for i in A.response.answer:
# for j in i.items:
# iplist.append(j) # 添加IP地址
# return True
# def checkip(ip):
# checkurl = str(ip)+":80" # 测试80端口
# socket.setdefaulttimeout(5) # 定义超时时间
# conn = http.client.HTTPConnection(checkurl) # 创建连接对象实例
# try:
# conn.request("GET","/",headers={"Host":appdomain})
# r = conn.getresponse()
# getcontent = r.read(15) # 返回形式为二进制
# getcontent =str(getcontent,'utf-8') # 将二进制转化为字符串类型
# finally:
# if getcontent == "<!DOCTYPE html>":
# print(str(ip)+" [OK]")
# else:
# print(str(ip)+" [error]")
# if __name__ == "__main__":
# if get_iplist(appdomain) and len(iplist) > 0:
# for ip in iplist:
# checkip(ip)
# else:
# print("dns resolver error")
"""文件比较方法模块difflib"""
# # 比较两个字符串的差异
# import difflib
# text1 = """text1:
# This module provides classes and functions for comparing sequences.
# including HTML and context and unified diffs.
# difflib document v7.4
# """ # 定义了两个文档
# text1_lines = text1.splitlines()
# text2 = """text2:
# This module provides classes and functions for Comparing sequences.
# including HTML and context and unified diffs.
# difflib document v7.4
# add string"""
# text2_lines = text2.splitlines()
# d = difflib.Differ()
# diff = d.compare(text1_lines,text2_lines) # 对两个文档的每一行进行对比
# print("\n".join(list(diff))) # 将结果输出逐行
# # 生成美观的对比html格式文档
# import difflib
# text1 = """text1:
# This module provides classes and functions for comparing sequences.
# including HTML and context and unified diffs.
# difflib document v7.4
# """ # 定义了两个文档
# text1_lines = text1.splitlines()
# text2 = """text2:
# This module provides classes and functions for Comparing sequences.
# including HTML and context and unified diffs.
# difflib document v7.4
# add string"""
# text2_lines = text2.splitlines()
# d = difflib.HtmlDiff()
# diff = d.make_file(text1_lines,text2_lines)
# print(diff) # 输出的内容为html格式的文档
"""文件差异性对比示例,difflib模块"""
# # 对比配置文件的差异性
# import difflib
# import sys
# def readfile(filename):
# try:
# fileHandle = open(filename,"rb")
# text = fileHandle.read().splitlines()
# fileHandle.close()
# return text
# except IOError as e:
# print("读取文件错误",e)
# sys.exit()
# try:
# textfile1 = sys.argv[1]
# textfile2 = sys.argv[2]
# except Exception as e:
# print("Error",e)
# print("请使用命令:python day2.py filename1 filename2")
# sys.exit()
# if textfile1 =="" or textfile2 =="":
# print("请使用命令:python day2.py filename1 filename2")
# sys.exit()
# text1_lines = readfile(textfile1)
# text2_lines = readfile(textfile2)
# d = difflib.HtmlDiff()
# print(d.make_file(text1_lines,text2_lines))
# # 文件与目录差异对比方法
# import filecmp
# print(filecmp.cmp("day1.py","day2.py")) # 单文件对比,返回结果为bool类型
# print(filecmp.cmpfiles("E:\\learn_courses\\python\\adb",
# "E:\\learn_courses\\python",["test.py",
# "apk软件包名.txt","wozai"])) # 比较两个目录下的同名文件,内容相同的为一个组,不同的为一个组,无法比较或不存在的一个组
# dirobj = filecmp.dircmp("E:\\learn_courses\\python\\adb",
# "E:\\learn_courses\\python\\Django",["test.py"]) # 目录比较,忽略test.py文件
# print("--------------report---------------------")
# dirobj.report() # 比较指定目录的内容
# print("--------------report_partial_closure---------------------")
# dirobj.report_partial_closure() # 比较指定目录及第一级子目录的内容
# print("--------------report_full_closure---------------------")
# dirobj.report_full_closure() # 递归比较指定目录的所有内容
# print("--------------其他---------------------")
# print("left_list",str(dirobj.left_list)) # 查看第一个目录的内容
# print("right_list",str(dirobj.right_list)) # 查看第二个目录的内容
# print("common:",str(dirobj.common)) # 查看两个文件夹中的同名文件,目录,被忽略的部分除外
# print("left_only:",str(dirobj.left_only)) # 查看只用第一个目录有,第二个目录没有的内容
# print("right_only:",str(dirobj.right_only)) # 查看只有第二个目录有第一个目录没有的内容
# print("common_dirs:",str(dirobj.common_dirs)) # 查看同名的目录
# print("common_files:",str(dirobj.common_files)) # 查看同名的文件
# print("common_funny:",str(dirobj.common_funny)) # 两边都存在的子目录
# print("same_files:",str(dirobj.same_files)) # 匹配相同的文件
# print("diff_files:",str(dirobj.diff_files)) # 不匹配的文件
# print("funny_files:",str(dirobj.funny_files)) # 两边目录都存在,但无法比较的文件
"""filecmp模块示例"""
# # 校验源与备份目录的差异,并更行备份文件或回退文件
# import os,sys
# import filecmp
# import re
# import shutil
# holderlist = []
# def compareme(dir1,dir2):
# dircomp = filecmp.dircmp(dir1,dir2)
# only_in_one = dircomp.left_only # 第一个目录新增文件
# diff_in_one = dircomp.diff_files # 第一个目录和第二个目录不一样的文件
# dirpath = os.path.abspath(dir1) # 定义第一个目录的绝对路径
# [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in only_in_one]
# [holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in diff_in_one]
# if len(dircomp.common_dirs) > 0: # 判断两个目录是否有相同的子目录,方便遍历子目录
# for item in dircomp.common_dirs:
# compareme(os.path.abspath(os.path.join(dir1,item)),
# os.path.abspath(os.path.join(dir2,item))) # 递归子目录
# return holderlist
# def main():
# if len(sys.argv) > 2: # 要求输入两个参数
# dir1 = sys.argv[1]
# dir2 = sys.argv[2]
# else:
# print("请在命令行输入命令: python day2.py dirname1 dirname2")
# sys.exit()
# source_files = compareme(dir1,dir2) # 对比两个目录的文件差异
# dir1 = os.path.abspath(dir1)
# if not dir2.endswith("/") :dir2 += "/"
# dir2 = os.path.abspath(dir2)
# destination_files = []
# createdir_bool = False
# if "\\" in dir1:dir1 = dir1.replace('\\','/') # 将目录中的\替换为/,防止符号转义
# if "\\" in dir2:dir2= dir2.replace('\\','/')
# for item in source_files:
# if "\\" in item:item= item.replace('\\','/')
# destination_dir = re.sub(dir1,dir2,item) # 进行re匹配,将差异文件的第一个路径替换为第二个路径
# destination_files.append(destination_dir)
# if os.path.isdir(item): # 检查差异文件在第二个路劲中是否存在,不存在则创建
# if not os.path.exists(destination_dir):
# os.makedirs(destination_dir)
# createdir_bool = True # 修改标志状态
# if createdir_bool: # 如果标志被更改,则执行该部分,重新遍历新创建的目录内容
# destination_files = []
# source_files = []
# source_files = compareme(dir1,dir2)
# for item in source_files:
# if "\\" in item:item= item.replace('\\','/')
# destination_dir = re.sub(dir1,dir2,item)
# destination_files.append(destination_dir)
# print("update item:")
# print(source_files) # 将不同的文件输出
# copy_pair = zip(source_files,destination_files)
# for item in copy_pair:
# if os.path.isfile(item[0]):
# shutil.copyfile(item[0],item[1])
# if __name__ == "__main__":
# a = input("""该程序的主要作用为对比源文件夹和备
# 份文件夹的差异,并且可以做到数据修
# 改,如果需要更新备份,请使用命令:
# python day2.py 源文件夹 备份文件夹
# 如果需要通过备份文件夹恢复源文件,
# 请使用命令:python day2.py 备份文件
# 夹 源文件夹,如果格式不正确,请使用
# Ctrl+C结束运行,重新键入命令。\n按回车继续........""")
# if a=="" or a!="":
# main()
每天学习的时间受工作影响,时多时少,但是希望自己可以一直更新下去,增加自己知识的同时,可以给各位网友带来一定的帮助。
因为是个人的学习内容,可能有很多地方的注释不正确,希望发现问题的网友能够及时给予指正,我是非常欢迎的。有不懂的地方以可以评论区留言,一起学习进步,欢迎各位python大佬留言。