#!/usr/bin/env python
# -*- coding: utf_8 -*-
# Date: 2015年10月23日
# Author:蔚蓝行
# 博客 http://www.cnblogs.com/duanv/ from IPy import IP
import threading
import nmap
import time
import sys
import subprocess
from xml.dom import minidom def usage():
print 'The script requires root privileges!'
print 'example:python scan.py 192.168.0.1/24' #生成xml文件的模板函数
def addResult(newresult):
global doc
global scan_result ip = doc.createElement("ip")
ip.setAttribute("address", newresult["address"]) osclass = doc.createElement("osclass")
osclass.appendChild(doc.createTextNode(newresult["osclass"]))
ip.appendChild(osclass) port = doc.createElement("port") tcp = doc.createElement("tcp")
tcp.appendChild(doc.createTextNode(newresult["tcp"]))
port.appendChild(tcp) udp = doc.createElement("udp")
udp.appendChild(doc.createTextNode(newresult["udp"]))
port.appendChild(udp) ip.appendChild(port)
scan_result.appendChild(ip) #扫描函数,调用nmap库
def ip_scan(ip):
global nm
#这里调用系统ping命令来判断主机存活
p = subprocess.Popen("ping -c 1 -t 1 "+ip,stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = True)
out = p.stdout.read()
#如过没有100%丢包则主机存活,对是否丢包的判断是抓取系统回显内容,测试用的是‘MAC OS X’系统,抓取内容为‘100.0% packet loss’
if '100.0% packet loss' not in out:
try:
#调用nmap扫描主机操作系统,同时进行SYN扫描和UDP扫描探测开放的端口
nm.scan(ip,arguments='-O -sS -sU -F')
sr={'address':ip,'osclass':str(nm[ip]['osclass'])[1:-1],'tcp':str(nm[ip].all_tcp())[1:-1],'udp':str(nm[ip].all_udp())[1:-1]}
addResult(sr)
except:
pass #循环,遍历未扫描的IP
def loop():
global mutex
global ipx while 1:
#线程锁,扫描一个IP就将IPX列表中的该IP移除
mutex.acquire()
#如果列表中没有IP,则跳出循环结束该线程
if len(ipx)<=0:
mutex.release()
break
ip=ipx[0]
ipx.remove(ipx[0])
mutex.release()
#调用扫描函数
ip_scan(str(ip)) #创建线程的函数,默认创建40个
def creat_threads():
threads=[]
for i in range(40):
threads.append(threading.Thread(target=loop,))
for t in threads:
t.start()
for t in threads:
t.join() def start():
#mutex:线程锁
global mutex
#ipx:存储要扫描的IP地址段列表
global ipx
#nm:nmap模块扫描对象
global nm
#doc:xml文档对象
global doc
#scan_result:xml文档的根元素
global scan_result if '-h' == sys.argv[1]:
usage()
exit()
else:
#获取命令行输入的要扫描的IP段
ip=sys.argv[1]
#xml文档一些对象的初始化
doc = minidom.Document()
doc.appendChild(doc.createComment("scan_result xml."))
scan_result = doc.createElement("scan_result")
doc.appendChild(scan_result) #初始化参数
ipx=[]
nm=nmap.PortScanner()
mutex=threading.Lock() #调用IPy模块的IP函数,将IP地址段的每个IP存入列表
ipp=IP(ip, make_net=True)
for x in ipp:
ipx.append(x)
#去掉首尾代表子网和全部主机的IP
ipx=ipx[1:-1] print("please wait...")
#计算时间
time_start=time.time()
#创建线程
creat_threads() time_end=time.time()
t=time_end-time_start
print '*'*48
print '\nTime:'+str(t)+'s'
print 'Scan results have been saved to scan_result.xml.\n'
print '*'*48 #xml文件操作
f = file("scan_result.xml","w")
f.write(doc.toprettyxml(indent = "\t", newl = "\n", encoding = "utf-8"))
f.close() if __name__=='__main__':
start()

Python调用nmap扫描网段主机信息生成xml的更多相关文章

  1. python调用nmap进行扫描

    #coding=utf-8 import nmap import optparse import threading import sys import re ''' 需安装python_nmap包, ...

  2. python 调用nmap

    1.系统中需要安装nmap 2.系统中安装pip 2.安装python调用nmap的lib包 命令为:pip install python-nmap 以下是在centos系统下安装成功后的截图 在命令 ...

  3. python网络编程之网络主机信息

    功能: 获取设备名称 方法: gethostname() 参数: 返回值:hostname(string) 功能: 获取设备ipv4地址 方法: gethostbyname() 参数: hostnam ...

  4. python调用nmap探测局域网设备

    平台:linux 描述:利用os.popen()函数调用系统命令nmap进行扫描,并用grep命令对扫描结果关键内容进行提取 代码 #!/usr/bin/env pthon #--*--coding= ...

  5. 使用python调用zxing库生成二维码图片

    (1)     安装Jpype 用python调用jar包须要安装jpype扩展,在Ubuntu上能够直接使用apt-get安装jpype扩展 $ sudo apt-get install pytho ...

  6. 最好的 NMAP 扫描策略

    # 适用所有大小网络最好的 nmap 扫描策略 # 主机发现,生成存活主机列表 $ nmap -sn -T4 -oG Discovery.gnmap 192.168.56.0/24 $ grep &q ...

  7. Python扫描器-端口扫描

    结合渗透测试最常见就是单个域名扫指纹,自动子域名查找.获取所有子域名的IP,自动C段IP查找相同子域名,利用有效IP扫端口. 常见端口库扫描 service_list = { 21:"FTP ...

  8. ping探测与Nmap扫描

    一.实验目的 学习信息收集的一般步骤 学会使用ping命令 利用Nmap工具进行信息搜集 二.实验环境 系统环境:一台windows7系统.一台XP系统.一台kali系统 软件环境:安装Wiresha ...

  9. Metasploit使用内网跳板, 扫描局域网主机

    最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...

随机推荐

  1. LeetCode150:Evaluate Reverse Polish Notation

    题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are + ...

  2. [翻译]NUnit---RequiresSTA and RequiresThread Attributes(十七)

    RequiresSTAAttribute (NUnit 2.5) RequiresSTA特性用于测试方法.类.程序集中指定测试应该在单线程中运行.如果父测试不在单线程中运行则会创建一个新的线程. No ...

  3. kylin的配置账号密码的加密方法

    kylin的配置账号密码的加密方法 kylin安装过程中,配置账户,其中密码是加密的.生成密码对应密文的 方法如下: import java.io.PrintStream; import org.sp ...

  4. WPF 捕捉全局异常

    public App() { //首先注册开始和退出事件 this.Startup += new StartupEventHandler(App_Startup); this.Exit += new ...

  5. DataType 枚举

    命名空间:   System.ComponentModel.DataAnnotations 成员名称 说明   CreditCard 表示信用卡号码.   Currency 表示货币值.   Cust ...

  6. XPath高级用法(冰山一角)

    运算符+内置函数 使用XPath选择元素时,使用运算符+内置函数来进行筛选: .//div[contains(@class,"ec_desc") or contains(@clas ...

  7. Android - "已安装了存在签名冲突的同名数据包",解决方法!

    错误提示:已安装了存在签名冲突的同名数据包. 解决方法:打开Android Studio,打开logcat,用usb线连接你出错的手机,识别出手机之后,在你的项目后面,点击“run”按钮,随后AS会提 ...

  8. jzoj5875

    這玩意嚴格意義上算是水法(因為可能會被卡) 題目中,如果按照一般的bfs來搜索,那麼有平方級邊,會tle 如果按照補邊的線性來搜索,那麼時間複雜度變為min(k*k,m)*n,視n,m同階,則時間複雜 ...

  9. 【NOIP2018】保卫王国 动态dp

    此题场上打了一个正确的$44pts$,接着看错题疯狂$rush$“正确”的$44pts$,后来没$rush$完没将之前的代码$copy$回去,直接变零分了..... 这一题我们显然有一种$O(nm)$ ...

  10. Centos6.7安装Pycharm及升级JDK

    首先到pycharm官网下载pycharm压缩包 wget https://www.jetbrains.com/pycharm/download/download-thanks.html?platfo ...