我有一个简单的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.']
>>>