在python3中,从bash执行DNS查询的最佳方式是什么?
我有一个简单的bash脚本,我正在考虑将它合并到我的python项目中,因为与这个bash oneliner相比,我无法在python3中找到一种优雅的方式来实现这一点。在python3或库中有没有更好的方法来帮助将所有合法的唯一主机名存储在列表或字典中 我试着做一些类似的事情在python3中,从bash执行DNS查询的最佳方式是什么?,python,python-3.x,linux,bash,dig,Python,Python 3.x,Linux,Bash,Dig,我有一个简单的bash脚本,我正在考虑将它合并到我的python项目中,因为与这个bash oneliner相比,我无法在python3中找到一种优雅的方式来实现这一点。在python3或库中有没有更好的方法来帮助将所有合法的唯一主机名存储在列表或字典中 我试着做一些类似的事情 test=[] 尝试: 打开(“挖掘日志”、“r”)作为d: 对于d行: 解析的_line=line.rstrip() 如果未解析_line.startswith(“;”): test.append(解析的_-lines
test=[]
尝试:
打开(“挖掘日志”、“r”)作为d:
对于d行:
解析的_line=line.rstrip()
如果未解析_line.startswith(“;”):
test.append(解析的_-lines.split())
除FileNotFoundError作为fnf_错误外:
打印(fnf_错误)
哪些输出
10.10.10.10.in-addr.arpa. 604800 IN PTR ns1.yowhat.sup
10.10.10.in-addr.arpa. 604800 IN NS ns1.yowhat.sup
ns1.yowhat.sup. 604800 IN A 10.10.10.10
有一大堆空行。我不知道如何优雅地将(所有)空白行(和)返回到Python中,只返回唯一的主机名。
我可以通过一个bash oneliner获得如下确切功能:
grep-v”;“$dig\u file | sed's/\.$//g'| sed-r'/^\s*$/d'| sed-n-e's/^.*PTR\t//p;s/^.*NS\t//p;s/^.*MX\t//p;s/^.*CNAME\t//p;s/^.*TXT\t//p'| sort-u>$output\u file\u name
它将输出
ns1.yowhat.sup
归档。
我在python程序中使用的帮助程序脚本是
#/usr/bin/env bash
dig_文件=$1
输出文件名=$2
尼斯='\e[1;32;92m[+]\e[0m'
解析_dig(){
echo-e“${NICE}解析dig查询以查找主机名
grep-v“$dig\u file | sed's/\.$//g'| sed-r'/^\s*$/d';sed-n-e's/^.*PTR\t//p;s/^.*NS\t//p;s/^.*MX\t//p;s/.*CNMAE\t//p;s/^.*TXT\t//p';sort-u>$output\u文件名
}
解析挖掘
然后我会在我的python项目中调用
subprocess.call(“./parse\u dig.log host\u names.log”,shell=True)
我如何才能像我的简单bash脚本助手脚本在python3中所做的那样,不需要使用一堆bash脚本来解析文件的输出?
不使用会更有意义吗
subprocess.call(“dig命令| tee dig.log”,shell=True)
然后做一些类似的事情
dig\u output=subprocess.check\u调用(“dig命令…”,shell=True,STDERR=subprocess.STDOUT)
然后以某种方式在python中解析dig_输出,或者说在python3中解析dig_输出的最优雅、最理想的方式是什么?您需要从python中运行
dig
并捕获输出:
from subprocess import PIPE, Popen
def cmdline(command):
process = Popen(
args=command,
stdout=PIPE,
shell=True
)
return process.communicate()[0]
在那之后,事情变得很容易:
>>> dig_output = [i.strip() for i in cmdline( 'dig google.com ns' ).split('\n')]
>>> dig_filtered = [i.split() for i in dig_output if len(i) > 10]
>>> domains = [i[-1] for i in dig_filtered if i[-2] in ['PTR', 'MS', 'NS', 'CNAME', 'TXT']]
>>> domains
['ns1.google.com.', 'ns2.google.com.', 'ns4.google.com.', 'ns3.google.com.']
>>>
要从python中运行
dig
,并捕获输出,您将需要以下内容:
from subprocess import PIPE, Popen
def cmdline(command):
process = Popen(
args=command,
stdout=PIPE,
shell=True
)
return process.communicate()[0]
在那之后,事情变得很容易:
>>> dig_output = [i.strip() for i in cmdline( 'dig google.com ns' ).split('\n')]
>>> dig_filtered = [i.split() for i in dig_output if len(i) > 10]
>>> domains = [i[-1] for i in dig_filtered if i[-2] in ['PTR', 'MS', 'NS', 'CNAME', 'TXT']]
>>> domains
['ns1.google.com.', 'ns2.google.com.', 'ns4.google.com.', 'ns3.google.com.']
>>>
您似乎在脚本中使用了regexp。为什么不在python中使用em?为什么要使用python?python有regexp're'模块。请参阅文档。预期输出?@absolutelycrasted我已经用预期输出更新了我的问题,在本例中,只有一个唯一主机名,但如果有多个,bash oneliner将ld最有可能捕获它们,前提是它们位于PTR、A、NS、MX或之后CNAME@MrPMillz-请将答案放在答案块中。回答您自己的问题是可以的。另外,您似乎在脚本中使用了regexp。为什么不在python中使用它们?为什么要使用python?python有regexp're'模块。请参阅文档。预期输出?@absolutelydevastated我已经用预期的输出更新了我的问题,在本例中,只有一个唯一的主机名,但是如果有多个,bash oneliner很可能会捕获它们,只要它们位于PTR、A、NS、MX或之后CNAME@MrPMillz-请将答案放在答案栏中。可以回答您自己的问题。另请参见太棒了@lenik。这正是我想要的,谢谢!一旦我有足够的声望点,我会投票给这个答案。另外,请注意,在python3中,你必须在.split()之前在cmdline()上调用.decode(“utf-8”).split('dig google.com ns')。decode(“utf-8”).split('\n'))太棒了@lenik。这正是我想要的,谢谢!一旦我有足够的声望点,我会投票给这个答案。另外,请注意,在python3中,你必须在.split()之前在cmdline()上调用.decode(“utf-8”).split('dig google.com ns')。decode(“utf-8”).split('\n'))