Chinaunix首页 | 论坛 | 博客
  • 博客访问: 670062
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2022
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-23 11:16
个人简介

西邮大三狗!!!

文章分类

全部博文(87)

文章存档

2015年(47)

2014年(40)

分类: Python/Ruby

2014-11-26 22:15:38

    最近入手一本腾讯大牛的著作《python自动化运维:技术与最佳实践》,打算仔细品读一番,今天在编写脚本时发现书中一个错误,将我的debug过程跟大家一起分享:
python有一个DNS的工具包,它几乎支持所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持事务签名、验证消息和扩展DNS,
在系统管理方面,我们可以利用它来代替类似nslookup、dig等工具:
    安装
  1. wget
  2. tar -zxf dnspython-1.12.0.tar.gz
  3. cd dnspython-1.12.0
  4. python setup.py install
    现在我们来实现一下查看A记录的脚本
  1. #!/usr/bin/env python
  2. import dns.resolver

  3. domain = raw_input('please input an domain:')
  4. A = dns.resolver.query(domain,'A')
  5. for i in A.response.answer:
  6.        for j in i.items:
  7.               print j.address
    现在来测试一下脚本,我是在pycharm上运行
    
    通过脚本很快的获取到了的IP地址,但是这个脚本是存在问题的,请换个域名试试
    
    出错了,根据提示我们可以看出来,CNAME这个对象没有address这个属性,我们不是在query()方法中指定我们的资源记录类型了吗?怎么会冒出来个CNAME呢?
    我们来看一下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记录相反
    SOA记录,一个起始授权区的定义

    现在我们debug一下这个脚本,来分析下脚本哪里出错了
        
    有没有发现,在response这个列表里,一个元素为CNAME记录,另一个为A记录。那我们进去看下CNAME里面都有哪些东西
    
    跟我们的错误情况一样,没有address这个属性,再看A记录里面的信息
    
    哈哈,我们要的address出来了,现在我们要如何改进这个脚本呢
    我的思路就是,再第二层循环里面根据rdtype判断一下j是否有address这个属性
    改进后的脚本如下  
  1. import dns.resolver

  2. def getipaddr():
  3.     domain = raw_input('please input an domain:')
  4.     A = dns.resolver.query(domain,'A')
  5.     for i in A.response.answer:
  6.         for j in i.items:
  7.              if j.rdtype == 1:
  8.                  print j.address
  9.              else:
  10.                  pass
  11. if __name__ == '__main__':
  12.     getipaddr()
    运行结果:
    
    我们再来解析一下
       
    
的确,有个CNAME,嘿嘿

    但是关于query()这个方法我还是有点不明白,在脚本中给了参数获取A记录,为什么会返回CNAME记录和A记录呢?   
    整个分析
过程没什么技术含量,但至少让我知道,运维=一半技术+一半经验,牛人也会范细节错误(我不是在诋毁大牛哦,他可是我偶像),所有身为小白菜的我们,有什么理由不好好学习呢?
    趁着还年轻,多读点书,多开阔下自己的眼界!
    还有这本写的也不错,是人都会范错误,错误再所难免,但书中的知识很值的我们学习,特别是对于喜欢python、运维的同学,我是极力推荐的!


阅读(12157) | 评论(3) | 转发(1) |
给主人留下些什么吧!~~

天边小草2015-07-08 17:52:34

大神如何解决windows下 dnspython 的安装的呀,我装的时候,老提示No Python installation found in the registry.


Python的环境变量 C:\\Python27 有加到系统的PATH中的,用运行-cmd-python是正常的

silence06072015-01-07 21:43:20

will835559313:这个是什么调试工具

pycharm

回复 | 举报

will8355593132015-01-07 17:21:05

这个是什么调试工具