0

csv ファイルを使用して、ファイルの最初の列にある各ドメインを nslookup しています。私がやっていることは、ドメイン リスト内のドメインがサーバーと一致するかどうかを確認することです。ドメインの MX レコードは私のサーバーを指していますか? ドメインのネームサーバーは私のネームサーバーと一致していますか?

今、私はセットアップのような作業をしています。サーバーIP/ホスト/などの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-Record を使用している場合、上記は失敗します。

出力 (mail.domain.com または mail2.mydomain.com など) を使用して、それを行に書き込む方が良いでしょう (または、以前と同様に socket.gethostbyname( value ) を実行します) 。

私がやりたいことの別の方法を見つけることができませんでした。オンライン検索では、ほとんどの場合、stdout 全体を使用して追加することが指摘されています。stdout で 'mail exchange =' ### を検索し、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

何かご意見は?

4

1 に答える 1

1

これは、stdout の解析に関する質問への回答ではありませんが、一般的な問題の解決に役立つと思います。

モジュールをチェックアウトしdnspythonます。提供された最初の例は、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)
于 2012-04-24T22:12:24.160 に答える