踩坑
本来我的win10里没有安装nmap,我直接pip install python-nmap安装了python-nmap模块,导致的最终结果就是报错,没有nmap二进制文件。
解决办法,去http://nmap.org/dist/下载nmap安装,在环境变量中添加安装nmap的路径(应该软件自动就给办了)。
然后就正常了。
编写端口扫描器
扫描192.168.0.189的1-1000的开放情况。
>>> import nmap //引入nmap模块
>>> nm=nmap.PortScanner() //实例化
>>> nm.scan('192.168.0.189','1-1000') //扫描192.168.0.189的1-1000端口
>>> for host in nm.all_hosts(): //遍历主机
... print('-------------------------------------------')
... print('Host:%s(%s)'%(host,nm[host].hostname())) //主机名
... print('State:%s'%nm[host].state()) //主机状态
... for proto in nm[host].all_protocols(): //遍历协议
... print('-------------------------------------------')
... print('Protocol:%s'%proto) //输出协议类型
... lport=nm[host][proto].keys() //获取协议的所有扫描端口
... lport.sort() //端口列表排序
... for port in lport: //遍历端口及输出状态
... print('port:%s\t state:%s'%(port,nm[host][proto][port]['state']))
命令行模式麻烦且不能纠错,因此写到e:// 1.py,然后cmd执行。(我试了试好像只能扫本机,别的好像要链接上才能扫)
扫描网段有哪些机器
import nmap
nm=nmap.PortScanner()
nm.scan(hosts='192.168.0.1/24',arguments='-sP') //ping主机在先扫描网段
hosts_list=[(x,nm[x]['status']['state']) for x in nm.all_hosts()] //保存主机状态
for host,status in hosts_list: //遍历主机名
print(host+" is "+status) //输出主机名和状态
异步扫描
import nmap
nma=nmap.PortScannerAsync() //支持异步扫描的函数
def callback_result(host,scan_result): //新定义
print '-------------------------------'
print host,scan_result //输出主机名和扫描结果
nma.scan(hosts='192.168.0.1/24',arguments='-sP',callback=callback_result)
会返回扫描的结果。