2012-04-24 16 views
0

私のファイルの最初の列の各ドメインをnslookupするためにcsvファイルを使用しています。 私がやっていることは、私のドメインリストのドメインが自分のサーバーと一致するかどうかをチェックすることです。 ドメインのMXレコードが自分のサーバーを指していますか? ドメインのネームサーバがネームサーバと一致していますか?python:変数/文字列としてテキストのstdoutを検索します。

今は設定作業があります。私のサーバーIP /ホスト/ etcのstdoutを検索しています。彼らが一致するかどうか、私は何かを書く。

しかし、MXレコードが自身のサブドメインを指している場合、そのレコードだけが自分のIPの1つであるかどうかを判断できません。これは、イムさんの状況:

例えば、nslookupコマンド:

$ 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. 

現在のサブドメインの回避策:

 elif 'mail.' + row[0] in stdout: 
       host2ip = socket.gethostbyname('mail.' + row[0]) 
       newdata = [host2ip] 
       writer.writerow(row + newdata) 

しかし、どのようなドメインが使用している場合は、MX = mail2.mydomain.comまたは任意の他のサブドメイン/ A-上記のエラーを記録します。方が良いだろう何

は出力(mail.domain.comまたはmail2.mydomain.comまたは何でも)を使用し、行にそれを書くことである((または以前のように私はsocket.gethostbynameます ))

Iveは私のやりたいことの別の方法を見つけることができません。オンライン検索では、stdoutを使用して追加することが主に指摘されています。どこでのメール交換機= '###のための標準出力を検索し、MX優先順位をprocedingテキスト、または、mail.mydomain.com

全体のpython

#!/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 

任意の考えを使用したいのですが?

答えて

1

これは、stdoutの解析についてのあなたの質問に答えていませんが、私はあなたの問題に一般的に役立つと思います。

dnspythonモジュールを確認してください。 first exampleは、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] 

UPDATE:あなたは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) 
+0

あなたは本当に正しいです、私はこれを読んでから書き直しています。今、私はdns.resolver.NXDOMAINを上げる方法を理解するだけです。喜びのないいくつかの方法を試しました。試行錯誤していますね。再度、感謝します! – Tommy

関連する問題