python:在标准输出中搜索作为变量/字符串的文本
我使用csv文件在文件的第一列中查找每个域。 我正在做的是检查我的域列表中的域是否与我的服务器匹配。 域的MX记录是否指向我的服务器? 域的名称服务器是否与我的名称服务器匹配 现在我有一个工作的设置。我在stdout中搜索我的服务器IP/主机等。如果它们匹配或不匹配,我会写一些东西 但是,如果MX记录指向其自身的子域,则不足以确定该子域是否是我的IP之一。这就是我现在所做的: 例如,查找:python:在标准输出中搜索作为变量/字符串的文本,python,string,search,variables,stdout,Python,String,Search,Variables,Stdout,我使用csv文件在文件的第一列中查找每个域。 我正在做的是检查我的域列表中的域是否与我的服务器匹配。 域的MX记录是否指向我的服务器? 域的名称服务器是否与我的名称服务器匹配 现在我有一个工作的设置。我在stdout中搜索我的服务器IP/主机等。如果它们匹配或不匹配,我会写一些东西 但是,如果MX记录指向其自身的子域,则不足以确定该子域是否是我的IP之一。这就是我现在所做的: 例如,查找: $ nslookup -type=MX mydomain.com Server: 192.168.
$ nslookup -type=MX mydomain.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
mydomain.com mail exchanger = 10 mail.mydomain.com.
Authoritative answers can be found from:
mail.mydomain.com internet address = 1.2.3.4 # << I seem to think this isn't always present.
但是,如果域正在使用mx=mail2.mydomain.com或任何其他子域/A-Record,则上述操作将失败
更好的方法是使用输出(mail.domain.com或mail2.mydomain.com或其他任何内容)并将其写入行(或者像前面一样,我将socket.gethostbyname(value))
我没能找到另一种方法来做我想做的事。在线搜索大多指向使用整个stdout进行附加。我想在标准输出中搜索“mail exchanger=”#####并使用处理mx优先级的文本,或mail.mydomain.com
整条蟒蛇
#!/usr/bin/python
#
import datetime
import csv
import os, time
import socket
from stat import * # ST_SIZE etc
from subprocess import Popen, PIPE, STDOUT
# Set Date
now = datetime.datetime.now()
today = now.strftime("%m-%d-%Y")
# Files
original = "dns_list.csv"
results = "results/dns_results_" + today + ".csv" #dns_results_04-14-2012.csv
tempfile = results + ".tmp"
# Commands
mxscan = "nslookup -type=MX"
nsscan = "nslookup -type=NS"
ascan = "nslookup -type=A"
digserver = "8.8.8.8"
SP = " "
incsv = open(original, 'rb')
try:
reader = csv.reader(incsv)
outcsv = open(tempfile, 'wb')
try:
writer = csv.writer(outcsv)
for row in reader:
p = Popen(mxscan + SP + row[0] + SP + digserver, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout, empty = p.communicate()
print 'Command: %s\nOutput: %s\n' % (mxscan + SP + row[0] + SP + digserver , stdout)
if not stdout or 'find Zone: NXDOMAIN' in stdout: # 'Zone' is column header
newdata = ['mail exchange']
writer.writerow(row + newdata)
elif 'psmtp.com' in stdout:
newdata = ['Postini']
writer.writerow(row + newdata)
elif 'mail.' + row[0] in stdout:
host2ip = socket.gethostbyname('mail.' + row[0])
newdata = [host2ip]
writer.writerow(row + newdata)
else:
newdata = ['External Email']
writer.writerow(row + newdata)
finally:
outcsv.close()
finally:
incsv.close()
original = tempfile
incsv = open(original, 'rb')
try:
reader = csv.reader(incsv)
outcsv = open(results, 'wb')
try:
writer = csv.writer(outcsv)
for row in reader:
p = Popen(nsscan + SP + row[0], shell=True, stdin=PIPE,stdout=PIPE, stderr=PIPE)
stdout, empty = p.communicate()
print 'Command: %s\nOutput: %s\n' % (mxscan + SP + row[0],stdout)
if not stdout or 'find Zone: NXDOMAIN' in stdout:
newdata = ['A records', 'Action']
writer.writerow(row + newdata)
elif 'nameserver = dauth1.mydomain.com' in stdout or 'nameserver = dauth2.mydomain.com' in stdout:
newdata = ['dauth1/2']
writer.writerow(row + newdata)
elif 'nameserver = ns1.mydomain.com' in stdout or 'nameserver = ns2.mydomain.com' in stdout:
newdata = ['ns1/2']
writer.writerow(row + newdata)
else:
newdata = ['External DNS', 'Delete/Charge']
writer.writerow(row + newdata)
finally:
outcsv.close()
finally:
incsv.close()
print "Writing changes to new file...."
time.sleep(1)
os.remove(tempfile)
print "Complete! Your new file is located at /root/mxscan/" + results
有什么想法吗?这并没有回答您关于解析stdout的问题,但我认为它总体上会帮助解决您的问题 查看模块。所提供的信息应该可以帮助您稍微清理一下MX查询
import dns.resolver
answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
print 'Host', rdata.exchange, 'has preference', rdata.preference
然后可以执行rdata.exchange的查找,并将其与属于您的主机名或ip地址进行比较
answers = dns.resolver.query(rdata.exchange)
[a.address for a in answers]
更新:
不确定您为什么要自己引发NXDOMAIN异常,但这是一种处理它们的方法
try:
answers = dns.resolver.query('bogus.test.for.nxdomain')
except dns.resolver.NXDOMAIN:
print "NXDOMAIN exception caught."
else:
print "What? Maybe my query is going to a 'helpful' server" \
"that resolves non-existant dns queries to its own server."
print "Add a filter for the ip address(s) we just got."
print list(answers)
你完全正确,自从读了这篇文章,我就一直在重写它。现在我只需要找出如何提升dns.resolver.NXDOMAIN。尝试了几种方法却毫无乐趣。我想是反复试验吧。再次感谢!
try:
answers = dns.resolver.query('bogus.test.for.nxdomain')
except dns.resolver.NXDOMAIN:
print "NXDOMAIN exception caught."
else:
print "What? Maybe my query is going to a 'helpful' server" \
"that resolves non-existant dns queries to its own server."
print "Add a filter for the ip address(s) we just got."
print list(answers)