相关文章推荐

dnspython Python 实现的一个 DNS 工具包,支持几乎所有的记录类型,可以用于查询,传输并动态更新ZONE信息,同时支持 TSIG (事务签名)验证消息和 EDNS0 (扩展DNS)。可以替代 nslookup dig 等工具,轻松做到平台整合

因为我电脑目前环境是 Python3.6 ,已经继承了 pip 软件管理工具,所以我就直接使用 pip 来进行安装 dnspython 模块了。

pip install dnspython   #最新版本为1.15.0,如果是Python2和Python3环境同时安装了,安装到指定python3上,则使用pip3 install dnspython进行安装

域名解析方法

dnspython 提供了大量的 DNS 处理方法,最常用的是域名查询。 dnspython 提供了一个 DNS 解析器类 resolver ,使用它的 query 方法来实现域名的查询功能.

query(self,qname,rdtype=1,rdclass=1,tcp=False,source=None,raise_on_no_answer=True,source_port=0)

qname 为查询的域名, rdtype 用来指定 RR 资源的类型:

A记录:将主机名转换成IP地址
MX记录:邮件交换记录,定义邮件服务器域名
CNAME记录:别名记录,实现域名间的映射
NS记录:标记区域的域名服务器及授权子域
PTR记录:反向解析,与A记录相反,将IP转换为主机名
SOA记录:一个起始授权区的定义

如果想要了解更多关于域名解析类型的信息,可以参考这篇文章( 链接

常见域名解析示例

上面说到了六种域名解析类型,不过我们常用的不过 A MX NS CNAME 四种解析类型。

①A记录
关于A记录的实例代码如下:

# -*- coding: utf-8 -*-
# @Time : 2017/10/1 9:58 
# @File : DNS.py 
# @Software: PyCharm
import dns.resolver
domain = input("请输入域名地址:")       # 输入域名地址
A = dns.resolver.query(domain, 'A')     # 指定查询记录为A型    
for i in A.response.answer:             # 通过response.answer方法获取查询回应信息
    # print(i)          
    for j in i.items:           
        print(j)

运行结果如下:

请输入域名地址:>? www.baidu.com
www.a.shifen.com.
14.215.177.38
14.215.177.39

这样子我们就将 www.baidu.com 的域名解析出来了。
除此之外,我们可以在调试窗口中看一下变量i是什么。

print(i)    # 输出变量i中的内容

输出结果如下:

>>> print(i)
www.a.shifen.com. 225 IN A 14.215.177.38
www.a.shifen.com. 225 IN A 14.215.177.39

发现 i 中具有两个条目,对应我们输出的 j 值。
另外这里面有几个需要注意的地方:

  • 在《Python自动化运维》一书中使用的 Python2.6 ,示例代码中最后一行为 print j.address ,即打印出变量i中的 address 属性,但是我在运行代码时出现异常,提示并没有该 address 属性存在,而直接打印变量 j 即可反馈出解析地址,这个具体原因还未知。
  • DNS 解析时出现了一个新的域名 www.a.shifen.com ,上网查了一下相关资料,根据 dig 跟踪发现 shifen.com baidu.com 服务器是同一台,具体可以参考( 链接

②MX记录
实现MX记录查询方法示例,在上面提到了是用于邮箱解析的,所以我们以QQ邮箱为例。

# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain')
MX = dns.resolver.query(domain, 'MX')   # 指定解析类型为MX记录
for i in MX:                            # 遍历回应结果
    print('MX preference =', i.preference, 'mail exchanger =', i.exchange)

运行结果如下:

>>> Please input a domain>? qq.com
MX preference = 20 mail exchanger = mx2.qq.com.
MX preference = 30 mail exchanger = mx1.qq.com.
MX preference = 10 mail exchanger = mx3.qq.com.

其中我们可以看到 preference 值(优先级)和 exchange 值(交换地址),其中优先级默认为 10 ,MX记录可以通过设置优先级实现主辅服务器设置,”优先级”中的数字越小表示级别越高,“优先级”仅对MX记录有效。

③NS记录
NS记录示例代码如下:

# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain')
NS = dns.resolver.query(domain, 'NS')
for i in NS.response.answer:
    for j in i.items:
        print(j.to_text())

运行结果如下:

>>> Input an domain>? baidu.com
dns.baidu.com.
ns3.baidu.com.
ns4.baidu.com.
ns2.baidu.com.
ns7.baidu.com.

NS(Name Server) 域名服务器记录。用来表明由哪台服务器对该域名进行解析。在注册域名时,总有默认的 DNS服务器 ,每个注册的域名都是由一个DNS域名服务器来进行解析的。但是需要注意的是只能输入一级域名,如: baidu.com ;对于二级以及多级域名,如 www.baidu.com wenku.baidu.com 则是错误的。

④CNAME记录
CNAME记录查询代码示例如下:

# -*- coding: utf-8 -*-
# @Software: PyCharm
import dns.resolver
domain = input('Input an domain:')
CNAME = dns.resolver.query(domain,'CNAME')
for i in CNAME.response.answer:
    for j in i.items:
        print(j.to_text())

运行结果如下:

>>> Input an domain:>? www.baidu.com
www.a.shifen.com.

发现又再次出现了上面在A记录中出现的 www.a.shifen.com 域名,这个域名就是 www.baidu.com 的别名指向。相当于用子域名来代替 ip地址 ,优点是如果 ip地址 变化,只需要改动子域名的解析,而不需要逐一改变 ip地址 解析。

注意事项:

  • CNAME的目标主机地址只能使用主机名,不能使用 IP地址
  • 主机名前不能有任何其他前缀,如: http:// 等是不被允许的;
  • A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。
运行环境:Python3.6,Windwos10 RS1,Pycharm模块介绍dnspython 是Python实现的一个DNS工具包,支持几乎所有的记录类型,可以用于查询,传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)。可以替代nslookup,dig等工具,轻松做到平台整合模块安装因为我电脑目前环境是Python3.6,已经继承了pip软件管理工具 上海检测web封停 这让我这种挂种子的PT党(迫真)感到害怕 以前我把国外的免费 域名 通过Cloudflare的免费动态解析到自己的路由器上,因为国外的免费 域名 不能备案,怕被查水表(似乎这么久也没挨停机,或许广西比较宽松),为防止万一,在阿里的万网上整了一个几块钱一年的 域名 来备案解析 看了一圈下来阿里似乎没有提供现成的D DNS 动态 域名 解析,只能自力更生了 参考:使用 python 实现阿里云动态 域名
家里整了2块8T硬盘,装了黑群晖,开通公网IP,一如IT童鞋的一贯作风——自己瞎倒腾 阿里云上买个便宜的 域名 ,通过 域名 解析到公网IP,可以在公网访问自己的NAS和其他服务。 但问题来了,家里是电信光纤,打了客服帮忙开通了公网IP,但并不是固定IP,IP会变化的,一会是14.X.X.X,一会是113.X.X.X,不太懂IP网段规划的事情(博客咋没的表情包。。。),难道每次都去阿里云的控制台...
import csv def get_nslookup(domain, dns ): res = subprocess.Popen("nslookup {0} {1}".format(domain, dns ), stdin=subprocess.PIPE, stdout=subprocess.P
因为突然有个邪恶的想法,想在自己的Android平板上面搭建一个 DNS 服务器 ,因为平板上之前安装过SL4A和 Python 的解释器,也想继续学学 Python 因此,就打算用 Python 实现了。 在Google上面找了一下, Python 实现的 DNS ,没找到我所希望的答案,因此就决定自己来实现了。 现在所实现的没什么高深的,只是能够对A记录查询进行简单的匹配和回复。 实现的代码如下:
Python 自动化运维 是现代企业中的必备技能,可以用于管理和维护IT基础设施,提高工作效率,降低生产成本。想要从入门到精通 Python 自动化运维 需要掌握以下几个方面: 1. Python 程序语言基础:可以通过学习基本的 Python 语法和语法结构,掌握基本的变量、函数、类等概念,以及流程控制语句、文件操作等基本知识。 2. 熟悉 Python 模块 Python 模块 是一个编写好的 Python 程序,可以被其他程序调用。了解 Python 模块 的使用方法以及官方库和第 方库的使用方法对于 Python 自动化运维 至关重要。 3. 熟悉自动化工具:自动化工具可以简化自动化脚本的编写和运行。有Linux系列的Ansible、Saltstack、Chef等自动化工具,Windows平台的Puppet、PowerShell等。 4. 熟悉操作系统和网络:系统和网络是 自动化运维 的理论和实践基础。熟悉Linux、Windows等操作系统和网络协议,以及相关工具的使用是必不可少的。 5. 学会自己动手编写脚本:通过实践编写自己的脚本,掌握 Python 编程技巧,提高自己的 自动化运维 技能,从而成为自己公司或者组织中的 Python 自动化运维 专家。 总之, Python 自动化运维 是一项必备技能,学习 Python 的基础语法和 Python 模块 的使用,熟练掌握自动化工具和操作系统网络知识,并通过实践编写自己的自动化脚本,从入门到精通需要不断练习和积累。
 
推荐文章