Python获取网络中的存活主机以及哪些主机是Linux

这个脚本用于扫描网络中的存活主机,通常在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命令来获取更相信的服务器硬件方面的信息。这个功能在我的博客中也有。

原文地址:https://www.cnblogs.com/yunxizhujing/p/10314914.html

时间: 2024-11-14 06:20:29

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

Python获取列表中的最后一个或者倒数第几个的方案

print(members[3]) 灵魂所在“ - (负号 )” 我们先来创建一个列表,和php中的数组一样. members = ['张三','李四','王五','芳芳','小明','小王'] 按照正常的方法,我们要取出第几个值,那么我们只需在知道他的索引即可,Python的索引从0开始 下面我们取出第一个用户的名称 print(members[0]) 得到的结果是张三,如果是 print(members[3]) 这是正向的取值,那么我们反序取值,只需加上 - 号即可 print(member

python 获取类中除内置方法外的所有方法名

#!/usr/bin/env python# !-*- coding:utf-8 -*- class Menu: def __init__(self): pass def updateProject(self): pass def restartProject(self): pass def restartTomcat(self): pass def stopTomcat(self): pass def startTomcat(self): pass def methods(self): ret

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

IPerf%E2%80%94%E2%80%94%E7%BD%91%E7%BB%9C%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E4%B8%8E%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%904 ?????DbYE1tZV??x?????g ????o12dt6wwG???ó??????? http://auto.315che.com/tyrs/qa23824193.htm?hwx http://auto.3

利用python 获取网址中的href(基于python 3.6)

import urllib.request from bs4 import BeautifulSoup def get_link(page): # 寻找链接的href linkData = [] for page in page.find_all('td'): links = page.select("a") for each in links: # if str(each.get('href'))[:1] == '/': 过滤if代码 data=each.get('href') li

python获取本机局域网IP地址(适用于Windows、Linux、Mac)

1 import socket 2 import platform 4 5 def getip(): 6 try: 7 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 8 s.connect(('www.baidu.com', 0)) 9 ip = s.getsockname()[0] 10 except: 11 ip = "x.x.x.x" 12 finally: 13 s.close() 14 return ip 15 16

网络中的概念

背板容量:整个交换机最大的吞吐量,将所有接口速率相加交换容量:CPU的交换容量转发能力:三层转发的容量 SFP+光模块是新一代的10G光模块,SFP+比早期的XFP光模块外观尺寸缩小了约30%,和普通1-4G的SFP光模块外观一样.SFP+只保留了基本的电光.光电转换功能,减少了原有XFP设计中的SerDes, CDR, EDC, MAC等信号控制功能(这些功能都转移到了主板上),从而简化了10G光模块的设计,功耗也因而更小.SFP+具有高密度.低功耗.更低系统构造成本等显著优点,产品广泛应用于

Windows Server 2008网络中顺畅访问“邻居”

通过网上邻居窗口寻找共享资源,是很多局域网用户经常要做的一项"功课",为了做好这项"功课",不少朋友积累和总结了不少网上邻居故障排除经验;然而这些经验在Windows Server 2008网络环境中,多数是没有多少用武之地的,毕竟Windows Server 2008系统是一种全新的工作环境,要想从Windows Server 2008网络中顺畅找到自己想要交往的"邻居",还需要总结新的网上邻居故障排除经验.为此,本文现在就对Windows S

活动目录管理及维护----------操作主机1(转移主机优化域控制器,占用操作主机较色,升级03域控制器到08)

享受生活  热爱挑战                                                                                        刘明远分享                 六操作主机  上(本章分两节) 每章一段话 没有永远的缘份,没有永远的生命,我们所能拥有的,可能只是平凡的一生.然而因为有你,生命便全然不同,世界也许因你而更加精彩.不要放弃了自己!!! (本章实验:转移主机的优化域控制器.  占用操作主机角色) 一  操作主

nmap探测大网络空间中的存活主机

前言 扫描大网络空间中的存活主机 实现 nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oX nmap_output.xml www.lijiejie.com/16 -sn 不扫描端口,只ping主机 -PE 通过ICMP echo判定主机是否存活 -n 不反向解析IP地址到域名 --min-hostgroup 1024 最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描 --min-pa