0

したがって、基本的には、次のような CSV ファイルのセットアップがあります。

IP or HostName, Device Name,  Device Description
10.10.10.10,    Device A,     Firewall
10.10.10.11,    Device B,     Firewall
10.10.10.12,    Device C,     Firewall
VBHOST12C,      Device D,     VM

ホスト名が IP に置き換えられるように、このリストを修正する必要があります。Python で csv を開き、IP の代わりにホスト名がある行に nslookup を使用し、それらをその IP に置き換えて、新しい修正された csv に出力すると考えました。これは可能ですか?

4

2 に答える 2

1

あなたがしていることは、一般的に「ping スイープ」と呼ばれ、PythonPingSweeper という用語でグーグル検索すると、大量のヒットが返ってきました。

私はこれをオンラインで見つけました。私が書いたと主張したら嘘をつくでしょう。私はあなたが探していることを古いDOS Batchで行いますが、Pythonは私のものではありません:

私が礼儀のルールに違反している場合は、ここにスクリプトを追加してから、黙って文句を言ってください。なぜなら、それらは通常、コンテキストのない単一行の URL 応答に不満を持っているのと同じ人々だからです。

https://gist.github.com/4404340

#!/usr/bin/python

import time
import subprocess
import socket


class CannotResolve(Exception):
  pass


def resolve(host):
  start = time.time()
  try:
    ip = socket.gethostbyname(host)
  except Exception, e:
    import traceback
    traceback.print_exc()
    raise CannotResolve("Cannot resolve %s: %s" % (host, e))
  else:
    end = time.time()
    return (ip, (end-start)*1000)


def ping(host):
  cmd = ['ping', '-c', '1', host]
  start = time.time()
  try:
    p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    so, se = p.communicate()

  except Exception:
    # On error, return 0
    print "Error running %s" % cmd
    print "stderr:\n%s" % se
    return 0

  else:
    end = time.time()
    return (end-start)*1000


class Connection(object):
  def __init__(self, host, port):
    self.host = host
    self.port = port

  def connect(self):
    retries = 10

    for x in range(retries):
      try:
        self.sock = socket.socket()
        self.sock.connect( (self.host, self.port) )

      except Exception:
        import traceback
        traceback.print_exc()
        print "Retry %s" % (x+1)
        time.sleep(1)
      else:
        return True

      print "Giving up after %s attempts" % retries

  def send(self, msg):
    print "Send: %r" % msg
    self.connect()
    retries = 10
    for x in range(retries):
      try:
        self.sock.sendall(msg)
      except Exception:
        import traceback
        traceback.print_exc()
        print "Retry %s" % (x+1)
        time.sleep(1)
      else:
        return True
    print "Giving up after %s attempts" % retries


def main():
  delay = 1

  hosts = ["google.com", "stackoverflow.com"]

  conn = Connection('127.0.0.1', 2003)
  while True:
    for h in hosts:
      now = int(time.time())

      hostname = socket.gethostname()

      print "Resolving %s" % h
      try:
        ip, speedms = resolve(h)
      except CannotResolve, e:
        print "Cannot resolve", e
        # Zero values
        conn.send(
          "pings.%s.dns_%s %s %d\n" % (
            hostname, h.replace(".", "_"), 0, now))
        conn.send(
          "pings.%s.ping_%s %s %d\n" % (
            hostname, h.replace(".", "_"), 0, now))

        continue # Next host

      else:
        conn.send(
          "pings.%s.dns_%s %s %d\n" % (
            hostname, h.replace(".", "_"), speedms, now))


      now = int(time.time())
      print "Pinging %s (%s)" % (ip, h)
      p = ping(h)
      print "done"

      conn.send(
        "pings.%s.ping_%s %s %d\n" % (
          hostname, h.replace(".", "_"), p, now))

      time.sleep(delay)


if __name__ == '__main__':
  main()
于 2013-01-15T02:55:25.963 に答える
0

特定のファイル (または stdin) の最初の列のホスト名を ip に変換し、結果を stdout に出力するには:

#!/usr/bin/env python
import csv
import fileinput
import socket
import sys
from multiprocessing import Pool

def ip(row):
    try:
        row[0] = socket.gethostbyname(row[0])
    except EnvironmentError:
        pass # return row as is if can't resolve address
    return row

def main():
    pool = Pool(20) # use concurrent connections
    rows = pool.imap(ip, csv.reader(fileinput.input()))
    csv.writer(sys.stdout).writerows(rows)

if __name__=="__main__":
    main()
于 2013-01-15T04:51:42.980 に答える