在python3中从bash执行DNS查询的最佳方法是什么?



我有一个简单的bash脚本,我正在考虑将其合并到我的python项目中,因为与这个单一的bash oneliner相比,我无法找到一种优雅的方式来在python3中执行此操作。有没有更好的方法可以在 python3 或库中执行此操作,以帮助将所有合法的唯一主机名存储在列表或字典中?

我尝试过做一些类似的事情,

test = []
try:
with open("dig.log", "r") as d:
for line in d:
parsed_lines = line.rstrip()
if not parsed_lines.startswith(";"):
test.append(parsed_lines.split())
except FileNotFoundError as fnf_error:
print(fnf_error)

其中输出,


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_file | sed 's/.$//g' | sed -r '/^s*$/d' | sed -n -e 's/^.*PTRt//p; s/^.*NSt//p; s/^.*MXt//p; s/^.*CNAMEt//p; s/^.*TXTt//p' | sort -u >$output_file_name

这将输出,

ns1.yowhat.sup

到文件。 我在 python 程序中使用的辅助 bashscript 是,

#!/usr/bin/env bash
dig_file=$1
output_file_name=$2
NICE='e[1;32;92m[+]e[0m'
parse_dig() {
echo -e "${NICE} parsing dig queries to find hostnames ya dig?"
grep -v ";" $dig_file | sed 's/.$//g' | sed -r '/^s*$/d' | sed -n -e 's/^.*PTRt//p; s/^.*NSt//p; s/^.*MXt//p; s/^.*CNMAEt//p; s/^.*TXTt//p' | sort -u >$output_file_name
}
parse_dig

然后我会在我的 python 项目中调用它做类似的事情,

subprocess.call("./parse_dig dig.log host_names.log", shell=True)

我怎样才能做我的简单 bash 脚本助手脚本在 python3 中所做的,以便不需要使用一堆 bash 脚本来解析文件的输出? 不使用会更有意义吗

subprocess.call("dig command | tee dig.log" , shell=True)

并做类似的事情,

dig_output = subprocess.check_call("dig command...", shell=True, STDERR=subprocess.STDOUT)

然后以某种方式解析 Python 中的dig_output,或者在 python3 中解析最优雅、最 pythonic、最理想的方法是什么?

你需要这个来从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.']
>>> 

相关内容

最新更新