gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:21 24 4
gpt4 key购买 nike

我有一个简单的 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/^.*PTR\t//p; s/^.*NS\t//p; s/^.*MX\t//p; s/^.*CNAME\t//p; s/^.*TXT\t//p' | sort -u >$output_file_name

哪个会输出,

ns1.yowhat.sup

到一个文件。我在我的 python 程序中使用的 helper 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/^.*PTR\t//p; s/^.*NS\t//p; s/^.*MX\t//p; s/^.*CNMAE\t//p; s/^.*TXT\t//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.']
>>>

关于python - 在 python3 中从 bash 执行 DNS 查询的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com