这个脚本用于扫描网络中的存活主机,通常在CMDB中自动获取主机的时候用到。

#!/usr/bin/env python
# -*- coding: utf-8 -*- """
执行这个脚本的主机要安装下面两个模块
pip3 install python-nmap 这个Python模块依赖操作系统的nmap
确保操作系统安装了nmap yum -y install nmap # for centos
主要功能:扫描网段获取存活主机以及主机是否为Linux。不是Linux的被标记为Unknown,这些主机会包括交换机、路由器、Windows等。
"""
import sys
from functools import partial import nmap
import telnetlib
import asyncio def timer(tagName):
import time
def wapper(func):
def aa(self, *args, **kwargs):
start = time.time()
data = func(self, *args, **kwargs)
end = time.time()
consume = end - start
if consume > 60:
min, sec = divmod(consume, 60)
print("%s 执行耗时:%s 分 %s 秒。" % (tagName, str(min), str(sec)))
else:
print("%s 执行耗时:%s 秒。" % (tagName, str(consume)))
return data
return aa return wapper class ScanHost(object): def __init__(self):
self._hostsinfor = [] @timer(tagName="扫描")
def scan(self, hosts='127.0.0.1', ports=None):
"""
扫描主机
:param hosts: 可以是IP也可以是网段,例如 192.168.100.10、192.168.100.0/24
:param ports: 可以写端口也可以写端口范围,例如22、22-33,默认是None也就是所有端口
:return: [{'IP': '127.0.0.1', 'Status': 'up', 'OSType': 'Linux'}, {}, {}]
"""
hostlist = self._scanner(hosts, ports)
loop = asyncio.get_event_loop()
taskList = []
for hostdic in hostlist:
taskList.append(loop.create_task(self._isLinux(hostdic["IP"],))) for task in taskList:
task.add_done_callback(partial(self._callback)) loop.run_until_complete(asyncio.wait(taskList))
return self._hostsinfor def _callback(self, future):
res = future.result()
self._hostsinfor.append(res) async def _isLinux(self, host, port='22'):
"""
判断目标主机是否是Linux,这是通过telnet远程登录SSH端口号后根据输出内容来判断的
所以需要远程主机开启SSH服务
:param host:
:param port:
:return: True|False
"""
try:
tm = telnetlib.Telnet(host=host, port=port, timeout=5)
# 读取的内容通常是这样的 b'SSH-2.0-OpenSSH_5.3\r\n' 字节,所以只需要判断是否含有OpenSSH就知道是否是Linux
# 因为默认Windows上面没有OpenSSH服务,虽然你可以单独安装通常来讲没必要。
b_content = tm.read_until(b'\n', timeout=5)
str_content = str(b_content.decode(encoding='utf-8')).strip()
# 判断是否包含OpenSSH字符,这里统一用大写比较
if "OPENSSH" in str_content.upper():
return {"IP": host, 'Status': 'up', "OSType": "Linux"}
else:
return {"IP": host, 'Status': 'up', "OSType": "Unknown"}
except (ConnectionRefusedError, TimeoutError) as err:
return {"IP": host, 'Status': 'up', "OSType": "Unknown"}
except Exception as err:
print("Error occurd in class ScanHost function _isLinux")
print("Error message: ", err) def _scanner(self, hosts, ports=None):
"""
探测某一主机是否存活或者探测给定网段内存活的主机
:param hosts: 可以是IP也可以是网段,例如 192.168.100.10、192.168.100.0/24
:param ports: 可以写端口也可以写端口范围,例如22、22-33
:return: [{'IP': '127.0.0.1', 'Status': 'up'}, {}, {}]
"""
data = []
try:
nm = nmap.PortScanner()
"""
-n 不显示主机名,不进行IP到主机名的反向解析
-sP 使用ICMP协议探测
-PE 显示哪些端口号开启
-sP -PE 使用IMCP和TCP来探测,结果不显示端口号
"""
nm.scan(hosts=hosts, ports=ports, arguments='-sP -PE ')
# 这里获取的只是返回的有效IP
hosts_list = nm.all_hosts() for host in hosts_list:
# 通过nmap实例获取主机的信息
# print(nm[host])
data.append({"IP": host, "Status": nm[host]["status"]["state"]})
return data
except Exception as err:
print("Error occurd in class ScanHost function _scanner")
print("Error message: ", err) def main():
sh = ScanHost()
print(sh.scan(hosts="172.16.48.0/24")) if __name__ == "__main__":
try:
main()
finally:
sys.exit()

判断是否是Linux主机的原理是这样的

由于Linux主机通常默认都会开启ssh服务而且默认端口是22,所以telnet上去会出现红色箭头指向的内容。

扩展内容,当有了这些Linux主机后就可以远程执行dmidecode命令来获取更相信的服务器硬件方面的信息。这个功能在我的博客中也有。

Python获取网络中的存活主机以及哪些主机是Linux的更多相关文章

  1. python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  2. 通过python基于netconf协议获取网络中网元的配置数据,助力企业网络控制自动化轻松实现!

    摘要:在当今信息化时代,大多数企业都需要网络支撑企业的ICT运行,提升企业运行效率,针对企业网络中的网元设备(包括交换机,路由器,防火墙等),很多企业希望根据自身的业务特点定制网络管理,比如可以实现网 ...

  3. 【381】python 获取列表中重复元素的索引值

    参考:获取python的list中含有重复值的index方法_python_脚本之家 核心思想:建立字典,遍历列表,把列表中每个元素和其索引添加到字典里面 cc = [1, 2, 3, 2, 4] f ...

  4. 如何用python获取文件中的某一行——python小技巧

    很多人有的时候只需要获取文章中的固定的一行,那么我知道这一行,我需要怎么样去获取呢 可能会有人说读取这一行,如果这一行是已什么开头的就读出来, 其实还有一种办法,就是我知道文件的路径.知道我要取的行数 ...

  5. H5_0016:js获取网络中配置文件中的参数

         //获取网络配置文件中的参数      $.get("https://cdn.com/share.json", function(e) {       //console ...

  6. python获取数组中最多的元素

    获取数组中数量最多的元素,也就是最频繁的那个元素,方法有很多,下面是3种最简单的: 用max函数 sample = [1,2,3,3,3,4,5,5] max(set(sample), key=sam ...

  7. python 方法无法在线程中使用(附python获取网络流量)

    在python中,定义一个方法,直接调用可以,但是创建一个线程来调用就可能导致失败.这种现象多出现在使用com对象进行系统操作时,而且是以线程的形式调用. 异常提示如下:syntax error.WM ...

  8. 配置vmWare10(桥接模式),使得虚拟机成为网络中的一台独立的主机

    受到启发的原文:https://www.cnblogs.com/liongis/p/3265458.html 第一步:配置虚拟网络 第二步:配置桥接(VMnet0) 第三步:给虚拟机配置桥接模式 第四 ...

  9. [python]获取网页中内容为汉字的字符串的判断

    实际上是这样,将获取到网页中表单内容与汉字字符串作比较,即: a = request.POST['a'] if a == '博客园': print 'ok' else: print 'false' a ...

随机推荐

  1. 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例

    最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...

  2. POJ_3304_Segments_线段判断是否相交

    POJ_3304_Segments_线段判断是否相交 Description Given n segments in the two dimensional space, write a progra ...

  3. 钉钉机器人zabbix报警

    首先在钉钉群聊里添加一个自定义的机器人 并复制webhook的内容 https://oapi.dingtalk.com/robot/send?access_token=37e23308d1b84eb4 ...

  4. 【爆料】-《西澳大学毕业证书》UWA一模一样原件

    ☞西澳大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...

  5. 再谈ERP选型

    这几天收到老友的消息,谈及他们公司ERP选型的结果,基本上确定了使用Oracle EBS,因此闹了接近一年的选SAP还是选Oracle的纷争落下帷幕. 这家企业我去年曾去交流过,跟他们聊了一下ERP行 ...

  6. ArrayList的add(E e)方法与扩容

    ArrayList是Java开发中经常用到的集合类,它是List接口的实现类,具有很高的查询性能,但不是线程安全的.本文主要讲述了ArrayList的add(E e)方法及该方法中涉及到的容量扩容技术 ...

  7. 前端利用百度开发文档给的web服务接口实现对某个区域周边配套的检索

    最近项目需要实现地图功能,以便于实现对房源周边配套设施的检索.内容如下 其实百度官方有对应的api,但是对于一个网站来说这样的样式难免有些难看 这样的结果显然不能满足当下的需求,所以我决定利用官方给的 ...

  8. 带着新人看java虚拟机06(多线程篇)

    其实多线程还有很多的东西要说,我们慢慢来,可能会有一些东西没说到,那就没办法了,只能说尽量吧! 1.synchronized关键字 说到多线程肯定离不开这个关键字,为什么呢?因为多线程之间虽然有各自的 ...

  9. 目标检测之R-CNN系列

    Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...

  10. .Net 事件总线之Autofac解耦

    事件总线是通过一个中间服务,剥离了常规事件的发布与订阅(消费)强依赖关系的一种技术实现.事件总线的基础知识可参考圣杰的博客[事件总线知多少] 本片博客不再详细概述事件总线基础知识,核心点放置使用Aut ...