自学python自动运维的第二天

自学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大佬留言。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值