在Python中使用dig命令

24 投票
3 回答
57219 浏览
提问于 2025-04-16 13:16

我先说一下,我的Python技能几乎为零,但我正在努力学习。

这个周末,我打算通过我们的DNS控制面板对大约58个CNAME做一些修改(只是更改目标地址)。

而且,我不想一个一个去检查这些修改是否生效,所以我在想有没有办法用Python写个脚本,自动检查每个CNAME的状态?

我用的dig命令大概是这样的:

dig @ns1.netnames.net www.rac.co.uk CNAME

我希望能看到返回的结果是rac-secure.gslb2.rac.co.uk

我试过类似这样的代码:

import os
os.system( 'dig<exampledomain.com>'CNAME )

但是好像没有成功(正如我说的,我的Python技能很差),我这样做对吗?还是应该用像dnspython这样的工具?我之前在Stack Overflow社区的帮助下用过dnspython模块,但我觉得它的文档实在太复杂了。

如果能给我一些正确的方向建议,我会非常感激。

谢谢

克里斯。

3 个回答

3

发现了两个额外的Python库,可以用来执行类似于dig的命令。
这两个库的名字都是pydig

1) leonsmith/pydig

安装方法:
pip install pydig

使用方法:

>>> import pydig
>>> pydig.query('example.com', 'A')
['93.184.216.34']
>>> pydig.query('www.github.com', 'CNAME')
['github.com.']
>>> pydig.query('example.com', 'NS')
['a.iana-servers.net.', 'b.iana-servers.net.']

2) shuque/pydig

安装方法:
(以管理员身份) python3 setup.py install

使用方法:

   pydig www.example.com
   pydig www.example.com A
   pydig www.example.com A IN
   pydig @10.0.1.2 example.com MX
   pydig @dns1.example.com _blah._tcp.foo.example.com SRV
   pydig @192.168.42.6 +dnssec +norecurse blah.example.com NAPTR
   pydig @dns2.example.com -6 +hex www.example.com
   pydig @192.168.72.3 +walk secure.example.com
8

os.system这个方法已经不推荐使用了。建议你使用subprocess.Popen来代替它:

import subprocess
import shlex

cmd='dig @ns1.netnames.net www.rac.co.uk +short'
# cmd='dig @ns1.netnames.net www.rac.co.uk CNAME'
proc=subprocess.Popen(shlex.split(cmd),stdout=subprocess.PIPE)
out,err=proc.communicate()
print(out)
# rac-secure.gslb.norwichunion.com.
56

你可以在Python中使用dig,不过直接用一个Python库可能会更省事。可以看看dnspython,这个库能让你更轻松地完成所有操作,而且你不需要去解析输出格式。

import socket
import dns.resolver

# Basic query
for rdata in dns.resolver.query('www.yahoo.com', 'CNAME') :
    print rdata.target

# Set the DNS Server
resolver = dns.resolver.Resolver()
resolver.nameservers=[socket.gethostbyname('ns1.cisco.com')]
for rdata in resolver.query('www.yahoo.com', 'CNAME') :
    print rdata.target

撰写回答